所以我有这个父进程A,它分叉并创建一些进程,B和C.C本身会创建更多,但我认为这并不重要。
A 叉子:
char *argv_exec[] = {
"/usr/bin/xfce4-terminal",
"--geometry",
"160x48",
"-x",
"./tv",
NULL };
pid_tv = fork();
if (pid_tv == 0)
{
(void) execv(argv_exec[0], argv_exec);
fprintf (stderr, "Errore nella execv.n%sn",
strerror(errno) );
anelito(0);
}
当它们一起运行时,我希望能够将信号从进程 B 发送到其父进程 A 以让他做某事 - 在这种情况下杀死所有孩子并重新分叉。
进程 A 将其 pid 发送到消息中的进程 B。
父 A 处理信号:
if(signal(SIGQUIT,riparti)==SIG_ERR)
...
void riparti(int s)
{
kill_all_children();
fork_all_children_again();
}
进程 B 在收到 SIGQUIT 时向 A 发送 SIGQUIT(它会退回)进程 B 具有:
signal(SIGQUIT,riparti);
void riparti(int a)
{
kill(pid_parent,SIGQUIT);
}
现在,当我在进程B的窗口中按一次CTRL + \时,一切顺利。如果我第二次这样做,进程 A 似乎不再接收信号。
我认为您正在从fork代码外部杀死父进程,您实际上是从进程A发送该信号,这反过来又会杀死父终端。