[解決済み] Linuxのシステムコールで子プロセスを殺すために、なぜwaitの後にWIFEXITEDをチェックする必要があるのですか?
2022-03-01 10:28:35
質問
の戻り値をチェックするC言語のコードに出会いました。
wait
をチェックし、エラーでなければさらに
WIFEXITED
と
WIFEXITSTATUS
. なぜこれが冗長でないのか?私が理解する限りでは
wait
はエラーが発生した場合 -1 を返し、一方
WIFEXITED
は0以外の値を返します。
wait
子プロセスは正常に終了しました。ですから、もしこの行にエラーがなかったら
if ( wait(&status) < 0 )
で何か問題が発生するのでしょうか?
WIFEXITED
チェック?
これがそのコードです。
#include <stdio.h>
#include <signal.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#define CHILDREN_NUM 5
int main () {
int i, status, pid, p;
for(i = 0; (( pid = fork() ) < 0) && i < CHILDREN_NUM;i++)
sleep(5);
if ( pid == 0 )
{
printf(" Child %d : successfully created!\n",i);
exit( 0 ); /* Son normally exits here! */
}
p = CHILDREN_NUM;
/* The father waits for agents to return succesfully */
while ( p >= 1 )
{
if ( wait(&status) < 0 ) {
perror("Error");
exit(1);
}
if ( ! (WIFEXITED(status) && (WEXITSTATUS(status) == 0)) ) /* kill all running agents */
{
fprintf( stderr,"Child failed. Killing all running children.\n");
//some code to kill children here
exit(1);
}
p--;
}
return(0);
}
解決方法は?
wait
戻る
>= 0
を呼び出すと、子プロセスが終了したことがわかります。
wait
しかし、そのプロセスが正常に終了したかどうか(あるいはそれがシグナルされたかどうか)はわかりません。)
しかし、あなたのコードを見ると、プログラムが、終了した子プロセスが正常に終了したかどうかを気にしていることがよくわかります。
<ブロッククオート
fprintf( stderr,"Child failed. Killing all running children.\n");
そこで、このプログラムでは、さらにテストを行うために
status
によって入力された構造体は
wait
:
-
WIFEXITED(status)
: プロセスは正常に終了したのでしょうか?(シグナルを受けたのとは対照的に)。 -
WEXITSTATUS(status) == 0
: プロセスが終了コード 0 (別名 "success") で終了したかどうか。詳しくは、以下を参照してください。 linux コマンドが返す終了ステータス 1 の意味 .
関連
-
[解決済み】ISO C90では、C言語での宣言とコードの混在が禁止されています。
-
[解決済み】GCC Cコードで静的宣言が非静的宣言に続くことを解決するには?
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】fgetsによるセグメンテーションフォールト(コアダンプ) - と思う。
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み] '{'トークンの前に期待される式
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み】シンプルなC言語のscanfが機能しない?重複
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] Bashで指定されたタイムアウト後に子プロセスを終了させるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】Cコンパイルエラーです。Idは1終了ステータスを返した
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み】サイズ8の無効な読み取り - Valgrind + C
-
[解決済み】MPI通信でMPI_Bcastを使用する場合
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】.axfファイルとは何ですか?