当我查看“启动工作”的参考资料时gnu.org http://www.gnu.org/software/libc/manual/html_node/Launching-Jobs.html#Launching-Jobs,我没有得到这部分。
shell 还应该调用setpgid
将其每个子进程放入新的进程组中。这是因为有一个潜力时间问题:每个子进程在开始执行之前必须放入进程组中新节目,并且 shell 依赖于组中的所有子进程才能继续执行。如果子进程和 shell 都调用 setpgid,则可以确保无论哪个进程首先访问它,都会发生正确的事情。
链接页面有两种方法,launch_job ()
and launch_process ()
。
他们都称setpgid
为了防止时间问题.
但我不明白为什么会出现这样的问题。
I guess 新节目意味着结果execvp (p->argv[0], p->argv);
in launch_process()
。在运行 execvp 之前,setpgid (pid, pgid);
总是执行,没有相同的功能launch_job ()
.
话又说回来,为什么会出现这样的问题呢? (为什么我们必须打电话setpgid ();
on launch_job ()
任何一个?)
问题是 shell 希望进程位于正确的进程组中。如果 shell 不调用setpgid()
在其子进程上,有一个时间窗口,在此期间子进程不属于进程组,而 shell 继续执行。 (通过调用setpgid()
shell 可以保证子进程在该调用之后是进程组的一部分)。
还有一个问题,就是子进程可能会执行新的程序(通过exec
)在正确设置其进程组 ID 之前(即在父进程调用之前)setpgid()
)。这就是为什么子进程也应该调用setpgid()
(在致电之前exec()
).
诚然,描述相当糟糕。这里解决的不仅仅是一个问题;这实际上是两个不同的问题。一 - 父进程(即 shell)希望子进程位于正确的进程组中。第二 - 新程序只有在其进程已放入正确的进程组后才应开始执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)