当我在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 ()
?)
答案 0 :(得分:1)
问题是shell希望进程位于正确的进程组中。如果shell没有在其子进程上调用setpgid()
,则会有一个时间窗口,在此期间子进程不是进程组的一部分,而shell继续执行。 (通过调用setpgid()
,shell可以保证子进程在该调用之后是进程组的一部分。)
还有另一个问题,即子进程可以在其进程组ID被正确设置之前(即在父进程调用exec
之前)执行新程序(通过setpgid()
)。这就是为什么子进程也应该调用setpgid()
(在调用exec()
之前)。
该描述无疑是非常糟糕的。这里没有解决一个问题;这真是两个不同的问题。一个 - 父(即shell)希望将子进程放在正确的进程组中。二 - 新程序只有在其进程已被放入正确的进程组后才应开始执行。