Почему существует проблема с синхронизацией времени при разветвлении дочерних процессов? - PullRequest
2 голосов
/ 17 мая 2011

Когда я взглянул на ссылку 'Launching-Jobs' в gnu.org , я не получил эту часть.

Оболочка также должна вызвать setpgid, чтобы поместить каждый из ее дочерних процессов в новую группу процессов. Это связано с тем, что существует потенциальная проблема синхронизации : каждый дочерний процесс должен быть помещен в группу процессов, прежде чем он начнет выполнять новую программу , а оболочка зависит от наличия всех дочерних процессов в группе, прежде чем он продолжает выполняться. Если и дочерние процессы, и оболочка вызывают setpgid, это гарантирует, что правильные вещи случаются независимо от того, какой процесс дойдет до него первым.

На странице ссылок есть два метода: launch_job () и launch_process (). Они оба вызывают setpgid, чтобы предотвратить проблему синхронизации .

Но я не понял, почему такая проблема.

Я думаю, новая программа означает результат execvp (p->argv[0], p->argv); в launch_process(). И перед запуском execvp всегда выполняется setpgid (pid, pgid);, без одной и той же функции на launch_job ().

Итак, еще раз, почему такая проблема? (почему мы должны звонить setpgid (); на launch_job ()?)

1 Ответ

1 голос
/ 17 мая 2011

Проблема в том, что оболочка хочет, чтобы процесс находился в правильной группе процессов. Если оболочка не вызывает setpgid() для своего дочернего процесса, существует окно времени, в течение которого дочерний процесс не является частью группы процессов, в то время как выполнение оболочки продолжается. (При вызове setpgid() оболочка может гарантировать, что дочерний процесс является частью группы процессов после этого вызова).

Существует еще одна проблема, заключающаяся в том, что дочерний процесс может выполнить новую программу (через exec) до того, как будет правильно установлен идентификатор его группы процессов (т.е. до того, как родительский вызов вызовет setpgid()). Вот почему дочерний процесс должен также вызвать setpgid() (до вызова exec()).

Описание, по общему признанию, довольно плохое. Здесь решается не одна проблема; это действительно две отдельные проблемы. Один - родитель (то есть оболочка) хочет, чтобы дочерний процесс был в правильной группе процессов. Второе - новая программа должна начать выполнение только после того, как ее процесс уже помещен в нужную группу процессов.

...