我正在尝试创建子进程,然后将SIGINT发送给子进程而不终止父进程。我试过这个:
pid=fork();
if (!pid)
{
setpgrp();
cout<<"waiting...\n";
while(1);
}
else
{
cout<<"parent";
wait(NULL);
}
但是当我点击C-c时,两个过程都被终止了
答案 0 :(得分:7)
不要使用 CTRL-C ,这会向具有相同控制终端的所有进程发送信号(即,在同一会话中)。 setpgid
虽然我认为有setsid
(设置会话ID)调用,但kill -INT pid
没有改变。
最简单的解决方案只是针对特定流程而不是会话。从命令行:
kill (pid, SIGINT);
来自C:
fork()
其中pid是您要将信号发送到的进程ID。
父级可以从getpid()
的返回值中获取相关的PID。如果孩子想要自己的PID,可以拨打{{1}}。
答案 1 :(得分:4)
Aha,流程小组和会议以及流程小组负责人和会议小组负责人的神秘面纱再次出现。
您的控制/ C将信号发送给一个组。您需要发出个人pid的信号,因此请遵循paxdiablo的指示或发信号(“杀死”)来自父母的孩子。并且不要忙等!将sleep(1)置于循环中,或者更好的是,等待(2)系统调用之一。
答案 2 :(得分:2)
您可以尝试实现一个SIGINT信号处理程序,如果子进程正在运行,它将终止子进程(如果没有,则关闭应用程序)。
或者,将父级的SIGINT处理程序设置为SIG_IGN,将子级设置为SIG_DFL。