首页 > 解决方案 > 从孩子到父母的丢失信号

问题描述

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

我应该如何编码?

#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

标签: clinux

解决方案


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


推荐阅读