Вы можете вызвать setpgid()
в разветвленном дочернем процессе, который выполнит сценарий оболочки. Это даст всем порожденным процессам из этого сценария оболочки тот же идентификатор группы, что и дочернему процессу. Затем вы можете использовать killpg()
, чтобы отправить сигнал всей группе, который получат все процессы в этой группе.
Например, если внутри дочернего процесса, который вы вызвали setpgid(0, 0)
, это создаст специальный экземпляр, в котором для идентификатора группы дочернего процесса будет установлено то же значение, что и для PID дочернего процесса. Тогда любые процессы, наложенные на дочерний процесс с использованием одной из функций семейства exec
, будут иметь то же значение идентификатора группы, что и дочерний процесс. Кроме того, любые процессы, которые могут быть вызваны вновь наложенным процессом, также будут иметь такой же идентификатор группы (т. Е. Ваш shell-скрипт). Затем, используя killpg()
, вы можете отправить сигнал любым процессам, совместно использующим значение идентификатора группы, используя только значение PID дочернего элемента, которое вернуло fork()
, поскольку идентификатор группы дочернего процесса совпадает с идентификатором дочернего PID после setpgid(0, 0)
звонок.
Если вы используете fork()
, в зависимости от того, как быстро вам нужно отправлять сигналы группе из родительского процесса, могут возникнуть некоторые проблемы с синхронизацией ... например, вы хотите немедленно отправить сигнал группе процессов справа после разветвления дочернего процесса. Для этого есть два обходных пути: либо 1) использовать vfork()
вместо fork, так что родительский элемент приостанавливается до тех пор, пока дочерний элемент не изменит свой идентификатор группы и успешно не вызовет exec
, или 2) вызов setpgid()
в родительский процесс , а также в дочернем процессе, но в родительском процессе вместо использования setgpid(0, 0)
, как вы это делаете в дочернем процессе, вы можете использовать setpgid(CHILD_PID, CHILD_PID)
. Тогда не имеет значения, какой вызов был успешным (один из них будет успешным, а другой потерпит неудачу с EACCES
), и любые последовательные сигналы, отправленные от родителя, теперь перейдут к действительному идентификатору группы.