0

所以我有这个父进程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 在收到一个(它反弹它)时向 A 发送一个 SIGQUIT,进程 B 具有:

signal(SIGQUIT,riparti);

void riparti(int a)
    {
          kill(pid_parent,SIGQUIT);
    }

现在,当我在进程 B 的窗口上按一次 CTRL+\ 时,一切顺利。如果我第二次这样做,进程 A 似乎不再收到信号了。

4

1 回答 1

1

我认为你正在从 fork 代码之外杀死父进程,你实际上是从进程A发送该信号,这反过来会杀死父终端。

于 2013-09-05T01:03:23.297 回答