首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从子节点到父节点的信号丢失

从子节点到父节点的信号丢失
EN

Stack Overflow用户
提问于 2019-04-10 16:57:49
回答 3查看 268关注 0票数 4

我正在创建几个子进程,这些子进程向其父进程发送信号并终止。我只是简单地数一数。但我从来没数对过。有些信号永远不会被处理程序捕获。

我该如何编码呢?

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> 
#include <sys/wait.h>

int ended = 0;

void handler(int sig){
    ended++;
}

int main(int argc, char **argv){
    int i;
    pid_t pid, ppid;

    if (signal(SIGUSR1, handler) < 0) {
        fprintf(stderr, "signal failed.\n");
        exit (-1);
    }

    ppid = getpid();

    for (i = 0; i < 50; i++){
        if ((pid = fork()) < 0){
            fprintf(stderr, "fork failed.\n");
            exit(-1);
        }
        if (pid == 0){  
            kill(ppid, SIGUSR1);
            exit(0);
        }       
    }

    while (wait(NULL) > 0);

    printf("ended = %d\n", ended);

    return 0;
} 

这个程序的输出有时是47,其他的是39...但决不是50

EN

回答 3

Stack Overflow用户

发布于 2019-04-10 17:19:17

这里的问题是,信号充当硬件中断,而您的处理程序函数将是ISR (中断服务例程)。然后,如果多个相同值的信号“同时”发生,linux内核只将它们视为一个信号。信号不被设计成以这种方式使用。应该使用信号将一个进程的状态通知给另一个进程。为了实现进程之间的通信,您应该使用IPC (InterProcess通信)机制,如队列、套接字或管道。

票数 3
EN

Stack Overflow用户

发布于 2019-04-12 15:01:05

谢谢,

我发现这个问题可以用实时信号来解决。只需使用SIGRTMIN更改SIGUSR1。实时信号排队(http://man7.org/linux/man-pages/man7/signal.7.html)。

这个解决方案有什么负面影响吗?

票数 1
EN

Stack Overflow用户

发布于 2019-04-10 18:09:35

它起作用了..

代码语言:javascript
运行
复制
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int ended = 0;

void handler(int sig)
{
    ended++;
}

    int main(int argc, char **argv)
    {
        int i;
        pid_t pid, ppid;

        if (signal(SIGUSR1, handler) < 0)
        {
            fprintf(stderr, "signal failed.\n");
            exit (-1);
        }

        ppid = getpid();

        for (i = 0; i < 50; i++)
        {
            if ((pid = fork()) < 0)
            {
                fprintf(stderr, "fork failed.\n");
                exit(-1);
            }
            if (pid == 0)
            {
                kill(ppid, SIGUSR1);
                exit(0);
            }
        }

        while (wait(NULL) > 0);

        printf("ended = %d\n", ended);

        return 0;
    }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55608559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档