我有一个shell脚本,可以启动其他4个二进制文件。我正在向shell脚本发送SIGSTOP。这是否也会阻止所有其他4个进程?如果没有,我该怎么做才能将SIGSTOP转发给这些流程?与SIGCONT类似。
我有所有4个二进制文件的C源代码。
答案 0 :(得分:5)
您可以在将执行shell脚本的分叉子进程中调用setpgid()
。这将为该shell脚本中的任何衍生进程提供与子进程相同的组ID。然后,您可以使用killpg()
向整个组发送信号,表示该组中的所有进程都将收到该信号。
例如,如果在子进程内部调用setpgid(0, 0)
,则会设置一个特殊实例,其中子进程的组ID将设置为与子PID的值相同的值。然后,使用exec
函数系列之一覆盖在子进程上的任何进程将具有与该子进程相同的组ID值。此外,新覆盖的进程可能产生的任何进程也将具有相同的组ID(即,您的shell脚本)。然后,您可以使用killpg()
仅使用fork()
返回的子{1}}的PID值向任何共享组ID值的进程发送信号,因为子进程的组ID与子进程的值相同setpgid(0, 0)
电话后的PID。
如果您使用fork()
,则根据您从父进程向组发送信号的速度可能会产生一些同步问题...例如,您希望立即向进程发送信号在分配子进程后立即组。有两种解决方法:1)使用vfork()
而不是fork,以便父级被挂起,直到孩子改变了它的group-ID并成功调用exec
,或2)调用父进程中的setpgid()
以及子进程中的,但是在父进程中,而不是像在子进程中那样使用setgpid(0, 0)
,您可以使用{{ 1}}。然后,哪个呼叫成功(其中一个将成功,另一个将以setpgid(CHILD_PID, CHILD_PID)
失败)无关紧要,并且从父亲发送的任何连续信号现在将转到有效的组ID。 / p>
答案 1 :(得分:1)
如果您的流程形成一个群组,则可以使用标准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)"