2

fork()、wait()、waitpid()、ゾンビ プロセスを知っています...非常に優れた本である W. Richard Stevens を読んで理解しました。

親でwait()を呼び出さないと、終了後に子がゾンビになります...これは悪いことです!

親で wait() を呼び出すと、親は子が終了するのを待ち、終了ステータスを受け取ってから続行します。書く?

fork() を一度呼び出してから、親で wait() を呼び出す多くの例を見てきました。

しかし、親が子を待ち、子が終了した後も続行する場合、実際のマルチタスクは行われません (技術的には 2 つのプロセスがありますが、論理的には役に立たない) では、なぜここで fork() を呼び出したのでしょうか?

fork() と wait() を 1 つのプロセスとして記述する代わりに、子のコードを記述してから親のコードを記述することもできたはずですが、そのほうがよいのではないでしょうか?

ありがとう!

4

2 に答える 2

1

親がすぐにブロックしようとしている場合でも、fork()を使用すると便利な場合があります。最も一般的なケースは、 system()呼び出しに似た何かを実行し、外部コマンドを実行してその完了を待っている場合です: fork() + execve()を実行します。(ただし、最新のコードでは、この目的のために代わりにposix_spawn()を使用することを検討する必要があります。)

それでも、wait()はブロックする必要はありません。フラグWNOHANGを指定してwaitpid()を使用して、完了したプロセスの終了コードを収集するか、まだ実行中の場合はすぐに続行できます。

于 2012-09-30T11:43:37.193 に答える
0

子フォークと一緒に、間に書いて同時に実行するコードfork()waitpid()

親は子が終了するまで待機します。多くの場合、単に子から配信されたデータを取得して親に公開します。タスクが「バックグラウンド」として実行されるメイン ループを実行するとします。例えば:

// a simple scheduler
while(1) {
   if(done_task_1) {
      // if done_task_1 is ever to change in the parent memory scope,
      // parent must know the exit status of its child fork.
      // otherwise there is no way to enter this if sentance, ever
      collect_data_1();
      run_task_1 = 0;
   }
   else if(run_task_1 == 1) {
      // iterate instructions for a sec
      posix_kill(pid_task_1, SIGCONT);
      sleep(1);
      posix_kill(pid_task_1, SIGSTOP);

   } 

   if(done_task_2) {
      collect_data_2();
      run_task_2 = 0;
   }
   else if(run_task_2 == 1) {
      // iterate instructions for a sec
      posix_kill(pid_task_2, SIGCONT);
      sleep(1);
      posix_kill(pid_task_2, SIGSTOP);

   } 
   if(run_task_1 == 0 && run_task_2 == 0) {
       break;
   }
}
于 2012-09-30T12:10:42.910 に答える