[解決済み] wait(NULL)は具体的にどのように動作するのですか?
2022-01-31 22:35:13
質問
を使用する場合
wait(null)
に到達する前に、その子が終了する (終了する) ことが (確実に) わかっている場合。
wait(null)
は、親プロセスで
wait(null)
は親プロセスをブロックするのでしょうか?
つまり
wait()
は、何のシグナルも受け取らないのでしょうか?
int main() {
int pipe_descs[2] ;
int i, n, p ;
srand(time(NULL( ;
pipe(pipe_descs) ;
for (i = 0; i < 2; i++) {
pid_t status = fork() ;
if (status == 0) {
n = rand() % 100;
p = (int) getpid() ;
write(pipe_descs[1], &n, sizeof(int)) ;
write(pipe_descs[1], &p, sizeof(int)) ;
exit(0) ;
}
else {
read(pipe_descs[0], &n, sizeof(int)) ;
read(pipe_descs[0], &p, sizeof(int)) ;
printf(" %d %d\n", n, p) ;
wait(NULL) ; // (1)
}
}
return 0 ;
}
解決方法は?
wait(NULL)
は、子プロセスのいずれかが終了するまで親プロセスをブロックします。もし親プロセスが
wait(NULL)
の場合、子プロセスは
zombie process
親が待機し、メモリから解放されるまで。
親プロセスが子プロセスを待たず、親プロセスが先に終了した場合、子プロセスは孤児となり、そのプロセスは
init
をその子とします。そして、initはプロセステーブルのプロセスエントリを待ち、解放します。
言い換えれば、子プロセスがオペレーティングシステムに終了ステータスを返し、それが親プロセスに返されるまで、親プロセスはブロックされることになります。親プロセスが wait(NULL) に達する前に子プロセスが終了した場合、子プロセスは終了ステータスを読み、プロセステーブルのプロセスエントリを解放し、同様に終了するまで実行を継続します。
関連
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み] '{'トークンの前に期待される式
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み】押されたキーをpythonスクリプトで待たせる方法とは?
-
[解決済み】配列型char[]が代入できない [重複]。
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
-
[解決済み】fork()、vfork()、exec()、clone()の違いについて)
-
[解決済み】__attribute__((constructor))は具体的にどのように機能するのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind - strcpyのサイズ1の無効な書き込み
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】変数の警告が設定されているが使用されていない
-
[解決済み】デバッガgdbの使用時に不明な終了シグナルが発生する。
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC