从孩子到父母的信号丢失

时间:2019-04-10 08:57:49

标签: c linux

我正在创建几个子进程,这些子进程向其父进程发送信号并死亡。我只是数一数。但是我从来没有得到正确的计数。有些信号永远不会被处理程序捕获。

我应该如何编码?

#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

3 个答案:

答案 0 :(得分:3)

这里的问题是信号充当硬件中断,而您的处理程序功能将是ISR(中断服务程序)。然后,如果多个具有相同值的信号“同时发生”,则Linux内核会将它们视为仅一个信号。信号并非设计为以这种方式使用。应该使用信号来告知另一个进程的状态。为了实现进程之间的通信,您应该使用IPC(进程间通信)机制,例如队列,套接字或管道。

答案 1 :(得分:1)

谢谢

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

此解决方案是否有负面影响?

答案 2 :(得分:-1)

正在工作。.

#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;
    }