知られているのは、 フォーク() システムコールは、呼び出し側プロセスの子となる新しいプロセスを作成するために使用されます。
終了すると、子は親に返される終了ステータスを残します。したがって、子供が終了すると、次のようになります。 ゾンビ 。
子が終了または停止するたびに、親に シルド 信号。
親は、システム コール wait() または waitpid() をマクロ WIFEXITED および WEXITSTATUS とともに使用して、停止した子のステータスを知ることができます。
(*)wait() システムコール: 子のいずれかが終了するまで、呼び出し元プロセスの実行を一時停止します。
wait() システムコールの構文:
pid_t wait(int *status);
(*)waitpid() システムコール: pid 引数で指定された子の状態が変化するまで、呼び出しプロセスの実行を一時停止します。
waitpid() システムコールの構文:
pid_t waitpid(pid_t pid int *status int options)
注: デフォルトでは、waitpid() は終了した子のみを待機しますが、この動作は WIFEXITED WEXITSTATUS などのオプション引数を介して変更できます。
pid の値は次のとおりです。
- -1 未満 : プロセス グループ ID が pid の絶対値と等しい子プロセスを待つことを意味します。
- -1 に等しい: 子プロセスを待機することを意味します。
- 0 に等しい: 呼び出しプロセスのプロセス グループ ID と等しい子プロセスを待つことを意味します。
- 0 より大きい : プロセス ID が pid の値と等しい子を待つことを意味します。
WIFEXITED と WEXITSTATUS は、子の終了ステータスを知るために使用できる 2 つのオプションです。
WIFEXITED(status) : 子が正常に終了した場合は true を返します。
WEXITSTATUS(status) : 子の終了ステータスを返します。このマクロは、WIFEXITED が true を返した場合にのみ使用する必要があります。
以下は、子が使用する C 実装です。 execl() 関数を実行しましたが、execl() に指定されたパスが未定義です。
親が取得する子の終了ステータス値が何であるかを見てみましょう。
// C code to find the exit status of child process #include #include #include #include #include // Driver code int main(void) { pid_t pid = fork(); if ( pid == 0 ) { /* The pathname of the file passed to execl() is not defined */ execl('/bin/sh' 'bin/sh' '-c' './nopath' NULL); } int status; waitpid(pid &status 0); if ( WIFEXITED(status) ) { int exit_status = WEXITSTATUS(status); printf('Exit status of the child was %dn' exit_status); } return 0; }
出力:

注記 : fork() が無効になっているため、上記のコードはオンライン コンパイラでは動作しない可能性があります。
ここで、終了ステータスは 127 で、パスに問題があるかタイプミスがあることを示しています。
追加情報として、いくつかの終了ステータス コードを以下に示します。
- 1 : 「ゼロ除算」やその他の許可されない操作などのその他のエラー。
-
2 : キーワード、コマンド、または権限の問題が欠落しています。 - 126 : 権限に問題があるか、コマンドが実行可能ファイルではありません
- 128 : 終了するための引数が無効です。
注: C 標準では、リターン コードの意味は定義されていません。リターン コードの使用規則はプラットフォームによって異なります。