所以我有这个父进程A分叉并创建一些进程,B和C.C本身会创建更多,但我认为不重要。
一把叉子:
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%s\n",
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时向它发送一个SIGQUIT(它反弹) 流程B有:
signal(SIGQUIT,riparti);
void riparti(int a)
{
kill(pid_parent,SIGQUIT);
}
现在,当我在进程B的窗口上按CTRL + \一次,一切顺利。 如果我第二次这样做,过程A似乎不再接收信号。
答案 0 :(得分:1)
我认为你是从fork代码之外删除了父进程,你实际上是从进程 A 发送了那个信号,这反过来会杀掉父终端。