2

我正在尝试创建一个子进程,然后在不终止父进程的情况下将 SIGINT 发送给子进程。我试过这个:

pid=fork();
  if (!pid)
  {
      setpgrp();
      cout<<"waiting...\n";
      while(1);
  }
  else
      {
      cout<<"parent";
      wait(NULL);
      }

但是当我点击抄送时,两个进程都被终止了

4

3 回答 3

8

不要使用CTRL-C,这会向具有相同控制终端的所有进程(即,在同一会话中)发送信号。尽管我认为为此目的有一个(设置会话 ID)调用,但这setpgid并没有改变。setsid

最简单的解决方案是简单地针对特定进程而不是会话。从命令行:

kill -INT pid

从 C:

kill (pid, SIGINT);

其中 pid 是您要将信号发送到的进程 ID。

父级可以从 的返回值中获取相关的 PID fork()。如果孩子想要自己的 PID,它可以调用getpid().

于 2009-11-19T05:58:28.963 回答
4

啊哈,流程组和会话以及流程组领导和会话组领导的奥秘再次出现。

您的控件/C 将信号发送到一个组。您需要向单个 pid 发出信号,因此请按照 paxdiablo 的指示或从父级发出信号(“杀死”)孩子。不要忙着等待!将 sleep(1) 放入循环中,或者更好的是,放入 wait(2) 系统调用之一。

于 2009-11-19T06:07:55.177 回答
3

您可以尝试实现一个 SIGINT 信号处理程序,如果子进程正在运行,则终止子进程(如果没有,则关闭应用程序)。

或者,将父级的 SIGINT 处理程序设置为 SIG_IGN,将子级的处理程序设置为 SIG_DFL。

于 2009-11-19T06:02:09.207 回答