3

execveで問題が発生しています。bashシェルと同じように機能するシェルを作成しようとしていますが、フォークされた子がコマンドを実行する際に問題が発生します。これが私が子供のために持っているものです。cmdは、ユーザーが入力したコマンドを含むchar *です。ただし、このプログラムを実行すると、perrorから次のエラーが発生します。

execve error: No such file or directory.

単純なlsを使用してプログラムを試しましたが、path = "/ bin / ls"を作成して実行する必要があります(これが私のlsコマンドの場所であることを確認しました)が、それでも文句を言います。私は何が間違っているのですか?ありがとう!

if(pid == 0)
{
    // Parse the command
    char * word = strtok(cmd, " ");
    char path[128] = "/bin/";
    strcat(path, word);

    // Execute the process
    char * newenvp[] = { NULL };
    char * newargv[] = { path, NULL };
    ret = execve(path, newargv, newenvp);

    if(ret == -1)
        perror("execve error");

    return EXIT_SUCCESS;
}
4

2 に答える 2

4

私が最初にすることは、挿入することです:

printf ("[%s]\n", path);

を呼び出す前にexecve。これにより、実行可能ファイルがあなたが思っているものであることを確認できます。

フィードしている入力が正しく、実行可能ファイルが実際に利用可能である限り、そのコードは問題ないように見えます。たとえば、次の完全なプログラムは私のDebianボックスで正常に動作します。

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main (int argc, char *argv[]) {
    if (argc > 1) {
        char * word = strtok (argv[1], " ");
        char path[128] = "/bin/";
        strcat (path, word);

        char * newenvp[] = { NULL };
        char * newargv[] = { path, NULL };
        printf ("[%s]\n", path);
        int ret = execve (path, newargv, newenvp);
        if (ret == -1) {
            perror("execve error");
        }
    }
    return 0;
}

./testprog ls実行すると、次の行に沿って何かを出力します。

[/bin/ls]
kidsshares.ods  paxwords    birthdays    homeloantracking.gnumeric
shares2011.ods  backup0.sh  development  lexar
accounts.ods    backup1.sh  photos       testprog.c
testprog
于 2012-04-15T01:17:46.457 に答える
1

正しいバイナリを見つけるためにファイルシステムを手動で移動したくない場合は、execlp(追加のpを使用して)あります。マンページから:

execlp ()、 execvp()、およびexecvpe()関数は、指定されたファイル名にスラッシュ(/)文字が含まれていない場合、実行可能ファイルを検索する際のシェルのアクションを複製しますこのファイルは、 PATH環境変数で指定されたディレクトリパス名のコロンで区切られたリストで検索されます。この変数が定義されていない場合、パスリストはデフォルトで現在のディレクトリになり、その後にconfstr(_CS_PATH)によって返されるディレクトリのリストが続きます。(このconfstr(3)呼び出しは通常、値 "/ bin:/ usr / bin"を返します。)[...]

于 2012-05-17T14:30:33.807 に答える