C++ 将SIGINT发送到子进程
我试图创建一个子进程,然后在不终止父进程的情况下将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(); 不能
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时,子级和父级都忽略了信号。