2

我知道 fork()、wait()、waitpid()、僵尸进程……我通过阅读 W. Richard Stevens 这本非常好的书来理解它们。

如果我们不在父母中调用 wait() ,孩子在终止后会变成僵尸......这很糟糕!

如果我们在 parent 中调用 wait(),则 parent 等待 child 终止,接收终止状态然后继续。写?

我已经经历了许多调用 fork() 一次然后在父级中调用 wait() 的示例。

但是,如果父母要等待孩子并在孩子终止后继续,那么就没有实际的多任务处理(技术上是的,有两个进程。但逻辑上没有用)那我们为什么在这里调用 fork() 呢?

我们可以先编写子代码,然后编写父代码,而不是 fork() 和 wait() 作为单个进程...不是更好吗?

谢谢!

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 回答