C 我如何向特定的孩子发送信号让它结束
这是代码,我运行了它,但所有三个孩子都结束了自己,但我在代码中指定SIGTERM只发送给第三个孩子 信号处理程序非常简单:C 我如何向特定的孩子发送信号让它结束,c,linux,C,Linux,这是代码,我运行了它,但所有三个孩子都结束了自己,但我在代码中指定SIGTERM只发送给第三个孩子 信号处理程序非常简单: ==================================================== void stop_handler(int signal_num) { printf("Signal %d is received \n", signal_num); } ========================================
====================================================
void stop_handler(int signal_num)
{
printf("Signal %d is received \n", signal_num);
}
====================================================
在main()中,我创建了3个进程:
====================================================
for (i = 0; i < 3; i++) {
if( (pids[i] = fork()) < 0 ) {
printf("Fork failed!\n");
exit(2);
} else if (pids[i] == 0) {
exit(do_childwork(i + 1));
} else {
active_children++;
}
}
====================================================
但我一运行3进程就立即停止了
从输出可以看出,我将信号发送到了正确的子进程。我编写了信号处理程序,以及通过谷歌搜索向进程发送信号的方法。那么我做错了什么以及如何纠正它们呢?您不需要多次安装信号处理程序。只需在信号处理程序中使用一个标志,并在设置标志时退出循环,即
static int flag = 0;
void stop_handler(int signal_num)
{
printf("Signal %d is received \n", signal_num);
flag = 1;
}
...
int do_childwork(int i)
{
if(signal(SIGTERM, stop_handler) == SIG_ERR) {
printf("signal install error\n");
exit(1);
}
while (!flag) {
printf("sleeping %d for not getting signal\n", j);
sleep(2);
}
return i * 3;
}
在发送
kill
命令后,父级是否做了任何事情来保持活动状态?你确定所有进程都因为SIGTERM而死亡吗?你应该使用strace-f
来跟踪所有进程,在日志(-o文件
)中,你会看到是什么信号/事件导致每个进程死亡。我想你误解了函数的工作原理——它只是安装了一个信号处理程序并立即返回。您的子进程没有被终止,它们只是正常退出,因为signal()
成功,所以do\u childwork()
打印一条消息并立即返回;不能从信号处理程序内部调用printf
(因为printf
不是异步信号安全的);也请阅读这是一种方便的方法。谢谢我在信号代码示例中看到了很多检查/阻塞,我需要在这里使用它们吗?@user3166982-如果我理解你在这里的评论,你不需要处理所有类型的信号。有些代码需要信号而其他代码可能不需要,这是有原因的。例如,如果您正在对套接字连接进行写入或读取,则如果另一端关闭连接,您将收到SIGPIPE。在这种情况下,您需要适当地处理信号。
====================================================
printf("Sending signal to: %d\n", pids[2]);
kill(pids[2], SIGTERM);
====================================================
static int flag = 0;
void stop_handler(int signal_num)
{
printf("Signal %d is received \n", signal_num);
flag = 1;
}
...
int do_childwork(int i)
{
if(signal(SIGTERM, stop_handler) == SIG_ERR) {
printf("signal install error\n");
exit(1);
}
while (!flag) {
printf("sleeping %d for not getting signal\n", j);
sleep(2);
}
return i * 3;
}