为什么在分叉子进程时会出现计时问题

时间:2011-05-17 02:41:32

标签: fork race-condition

当我在gnu.org中查看“启动 - 工作”的参考时,我没有得到这一部分。

  

shell还应调用setpgid将其每个子进程放入新进程组。这是因为存在潜在的计时问题:每个子进程必须在开始执行新程序之前放入进程组,并且shell依赖于所有的子组继续执行之前的进程。如果子进程和shell都调用setpgid,这可以确保无论哪个进程首先进入它,都会发生正确的事情。

链接页面上有两种方法launch_job ()launch_process ()。 他们都会调用setpgid以防止计时问题

但我不知道为什么会出现这样的问题。

我猜新计划表示execvp (p->argv[0], p->argv);launch_process()的结果。在运行execvp之前,始终执行setpgid (pid, pgid);launch_job ()上没有相同的功能。

再说一遍,为什么会出现这样的问题? (为什么我们要在setpgid ();上拨打launch_job ()?)

1 个答案:

答案 0 :(得分:1)

问题是shell希望进程位于正确的进程组中。如果shell没有在其子进程上调用setpgid(),则会有一个时间窗口,在此期间子进程不是进程组的一部分,而shell继续执行。 (通过调用setpgid(),shell可以保证子进程在该调用之后是进程组的一部分。)

还有另一个问题,即子进程可以在其进程组ID被正确设置之前(即在父进程调用exec之前)执行新程序(通过setpgid())。这就是为什么子进程也应该调用setpgid()(在调用exec()之前)。

该描述无疑是非常糟糕的。这里没有解决一个问题;这真是两个不同的问题。一个 - 父(即shell)希望将子进程放在正确的进程组中。二 - 新程序只有在其进程已被放入正确的进程组后才应开始执行。