【发布时间】:2013-09-05 00:50:46
【问题描述】:
所以我有这个父进程 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 时,它会向 A 发送一个 SIGQUIT(它会反弹它) 进程 B 有:
signal(SIGQUIT,riparti);
void riparti(int a)
{
kill(pid_parent,SIGQUIT);
}
现在,当我在进程 B 的窗口上按一次 CTRL+\ 时,一切顺利。 如果我再做一次,进程 A 似乎不再收到信号了。
【问题讨论】:
-
添加用于分叉的代码。
-
我不确定,它应该可以工作
-
这很奇怪,我可以从子窗口和实际父窗口(正如我所期望的那样)发送带有 Ctrl+\\ 的 SIGQUIT 但是一旦我这样做了另一个 Ctrl+\ \ 我按似乎不再起作用了;字符 ^\\ 打印在屏幕上,但没有任何反应。我还检查了 sigpending() 并且在第一个之后没有发送任何信号!