1

私は、子プロセスを作成してから execvp() を呼び出す偽のシェルを作成しています。通常のシェルでは、'hello' などの不明なコマンドを入力すると、'hello: Command not found.' が返されます。ただし、hello を execvp() に渡すと、デフォルトではエラーは返されず、何も起こらなかったように残りのプログラムを実行し続けます。実際に何も実行されていないかどうかを確認する最も簡単な方法は何ですか? ここに私のコードがあります:

if(fork() == 0)
{
     execvp(cmd, args);
}
else
{
     int status = 0;
     int corpse = wait(&status);
     printf(Child %d exited with a status of %d\n", corpse, status);
}

死体 < 0 の場合、それは未知のコマンドであることはわかっていますが、待機したくない場所 (コマンドの最後に & が入力された場合など) がリストされていないコード内の他の条件があります。助言がありますか?

4

2 に答える 2

4

エラーが発生した場合 (が適切に設定されている場合) 、すべてのexecメソッドが -1 を返すことができます。errno結果をチェックしていないexecvpため、失敗した場合、プログラムの残りの部分は引き続き実行されます。プログラムの残りの部分が実行されないようにするには、次のようなものがあります。

if (execvp(cmd, args) == -1)
    exit(EXIT_FAILURE);

fork()for <0の結果も確認します。

于 2010-10-13T21:28:52.850 に答える
0

2 つの独立した懸念事項があります。

1) は execvp の戻り値です。戻らないはずです。もしそうなら、問題があります。これは、悪いコマンドを execvp した結果です。execvp が失敗しても待ちたくありません。常に戻り値を確認してください。

int res = execvp(argv[1], argv);
printf ("res is %i %s\n", res, strerror(errno));
// => res is -1 No such file or directory

2) もう 1 つの懸念事項は、バックグラウンド プロセスなどです。これはシェルの仕事であり、いつプログラムがすぐに待機する必要があるか、いつ fork から pid を保存して後で待機する必要があるかを把握する必要があります。

于 2010-10-13T21:37:49.957 に答える