C++ 将SIGINT发送到子进程

C++ 将SIGINT发送到子进程,c++,linux,signals,sigint,C++,Linux,Signals,Sigint,我试图创建一个子进程,然后在不终止父进程的情况下将SIGINT发送给子进程。我试过这个: pid=fork(); if (!pid) { setpgrp(); cout<<"waiting...\n"; while(1); } else { cout<<"parent"; wait(NULL); } pid=fork(); 如果(!pid) { setpgrp(); 不能

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

pid=fork();
  if (!pid)
  {
      setpgrp();
      cout<<"waiting...\n";
      while(1);
  }
  else
      {
      cout<<"parent";
      wait(NULL);
      }
pid=fork();
如果(!pid)
{
setpgrp();
不能不要使用CTRL-C,这会向具有相同控制终端的所有进程发送一个信号(即,在同一会话中)。这是
setpgid
不会改变的,尽管我认为有一个
setid
(set session ID)调用用于此目的

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

kill -INT pid
从C:

kill (pid, SIGINT);
其中,pid是要向其发送信号的进程ID


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

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


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

Aha,流程组和会话以及流程组组长和会话组组长的奥秘再次出现


您的控件/C向一个组发送了信号。您需要向一个单独的pid发送信号,因此请按照paxdiablo的指示或从父级向子级发送信号(“杀死”)。不要忙着等待!在循环中设置睡眠(1),或者更好地设置一个等待(2)系统调用。

而不是
while(1);
使用
while(1)sleep(1)
在CPU上容易得多。一般来说,代替
while(e);
do代替
while(e)继续;
,但在这种情况下wallyk说了什么。DigitalRoss:这里使用continue有什么不同?我使用了
sigaction
来更改父级的信号处理程序,它工作了,但是当试图将父级设置为SIG_IGN,将子级设置为SIG_DFL时,子级和父级都忽略了信号。