19

私の単純なカスタム シェルでは、標準入力からコマンドを読み取り、execvp() で実行しています。この前に、現在のプロセスのフォークを作成し、その子プロセスで execvp() を呼び出し、その直後に exit(0) を呼び出します。

このようなもの:

pid = fork();

if(pid == -1) {
    perror("fork");
    exit(1);
}

if(pid == 0) {
    // CHILD PROCESS CODE GOES HERE...
    execvp(pArgs[0], pArgs);
    exit(0);
} else {
    // PARENT PROCESS CODE GOES HERE...
}

さて、execvp() で実行されるコマンドはエラーを返しますよね? 私はそれを適切に処理したいと思っています。現在、私は常に exit(0) を呼び出しています。これは、子プロセスが常に「OK」状態になることを意味します。

execvp() 呼び出しから適切なステータスを返し、それを exit() 呼び出しに入れるにはどうすればよいですか? execvp() が返す int 値を取得し、それを 0 ではなく exit() 引数として渡す必要があります。それで十分ですか?

4

3 に答える 3

18

子が終了してエラー メッセージが表示されるまで待機するには、親コードでwaitpid(3)orを使用する必要があります。wait(1)

構文は次のとおりです。

pid_t waitpid(pid_t pid, int *status, int options);

また

pid_t wait(int *status);

status終了ステータスが含まれます。マンページを見て、それを解析する方法を確認してください。


子プロセスからこれを行うことはできないことに注意してください。execvp子プロセスを呼び出すと(すべての実用的な目的で)終了し、'd プロセスに置き換えられます。そこにexec到達できる唯一の方法は、それ自体が失敗した場合ですが、その失敗は新しいプログラムが終了したためではありません。それは、最初から走らなかったからです。exit(0)execvp

編集:子プロセスは実際には死にません。execPID と環境は変更されませんが、コードとデータ全体が'd プロセスに置き換えられます。失敗しない限り、元の子プロセスに戻らないことを期待execできます。

于 2009-05-24T14:26:20.293 に答える
3

wait()またはwaitpid()を親プロセスで使用します。ここでの例:OSがプロセスを強制終了したときのリターンコード

また、子が死ぬと、SIGCHLDシグナルが親プロセスに送信されます。

于 2009-05-24T16:05:08.047 に答える