どのように口を子プロセスに戻り、その状況からexecvp()?
質問
私の簡単なカスタムシェルのいくつかについて触れたいと思いコマンドの標準入力から、実に実行しexecvp().この前に、私が作成したフォークの現在のプロセスと呼びかけにexecvp()はその子プロセスは、とにかく、どうしたらいいでしょうか通口(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()で返しの誤りでしょ?たいへの対応として、今、私は常に呼び出し口(0)とは、子プロセスは、常に"OK"の状態です。
どのように戻ったとしても、適切な状況からexecvp()を呼び出しは一切できませんので、exit()電話のかけ方は?うかを取得しint値execvp()を返すだけでなく、exit()の引数ではなく0になります。は十分正しいのですか。
解決
あなたは終了し、エラーメッセージを取得するために子供を待つために、親コードにwaitpid(3)
またはwait(1)
を使用する必要があります。
構文は次のとおりです。
pid_t waitpid(pid_t pid, int *status, int options);
または
pid_t wait(int *status);
あなたは子プロセスからこれを行うことができないことに注意してください。あなたは の編集の子プロセスがが本当にの死にません。 PIDと環境は変化しませんが、全体のコードとデータをstatus
は終了ステータスが含まれています。 rel="noreferrer"> manページは、それを解析する方法をあなたに会いには
<時間>
execvp
子プロセスを呼び出した後の のは、(すべての実用的な目的のために)のの死に、はexec
'dプロセスによっての置き換えられます。 exit(0)
自体が失敗した場合は、execvp
に達することができる唯一の方法はありますが、新しいプログラムが終了しているため、その後の故障ではありません。それがそもそも走ったことがないからです。exec
'dプロセスに置き換えられます。 exec
が失敗しない限りあなたは、オリジナルの子プロセスに戻るのではないが、のを頼りにすることができます。
他のヒント
からのご質問は少し辛い出だと思います。いすカバーのカップルに関連する問題
execvp()
どちらかを返さない(成功)、またはエラーを返します。意味を子どものコードのみ対応。子どものコードを捉えた結果、execvp()
使用する値exit()
と考えられる。子どものコードを返しません0以降のみが成功のexecvp
たや その processsは0を返します(します。- の親を取得できる子ども情報から
waitpid()
つま口です。が定義されたマクロプ情報から返されるstatus
パラメータとします。特にお客様の特定の目的のためにはWIFEXITED
さんの場合子供の終了した"通常"、WEXITSTATUS
の子どもの状況として渡されるexit()
.を参照waitpid
manページのその他のマクロです。
親プロセスにwait()
またはwaitpid()
を使用してください。ここでの例:OSは、あなたのプロセス >。
また、SIGCHLD
信号が親プロセスに送信されます。