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