Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我如何向特定的孩子发送信号让它结束_C_Linux - Fatal编程技术网

C 我如何向特定的孩子发送信号让它结束

C 我如何向特定的孩子发送信号让它结束,c,linux,C,Linux,这是代码,我运行了它,但所有三个孩子都结束了自己,但我在代码中指定SIGTERM只发送给第三个孩子 信号处理程序非常简单: ==================================================== void stop_handler(int signal_num) { printf("Signal %d is received \n", signal_num); } ========================================

这是代码,我运行了它,但所有三个孩子都结束了自己,但我在代码中指定SIGTERM只发送给第三个孩子

信号处理程序非常简单:

====================================================
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;

}