Как отправить SIGSTOP всем процессам, запущенным из сценария оболочки - PullRequest
1 голос
/ 01 июля 2011

У меня есть сценарий оболочки, который запускает 4 других двоичных файла.Я отправляю SIGSTOP в сценарий оболочки.Останавливает ли это также все остальные 4 процесса?Если нет, что я должен сделать, чтобы переслать SIGSTOP в эти процессы?То же самое в случае с SIGCONT.

У меня есть исходный код C для всех 4-х двоичных файлов.

Ответы [ 2 ]

5 голосов
/ 01 июля 2011

Вы можете вызвать 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), и любые последовательные сигналы, отправленные от родителя, теперь перейдут к действительному идентификатору группы.

1 голос
/ 01 июля 2011

Если ваши процессы образуют группу, вы можете использовать стандарт kill (1). man kill имеет следующую информацию:

pid... 
    Specify the list of processes that kill should signal. Each pid can be one of five things: 
n 
    where n is larger than 0. The process with pid n will be signaled. 
    All processes in the current process group are signaled.
-1 
    All processes with pid larger than 1 will be signaled. 
-n 
     where n is larger than 1. All processes in process group n are signaled. When an argument of the form '-n' is given, and it is meant to denote a process group, either the signal must be specified first, or the argument must be preceded by a '--' option, otherwise it will be taken as the signal to send. 
commandname

Мне кажется, что спецификация '-n' может вам помочь

kill -STOP -- "-$(pgrep myparentproc)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...