不是每个信号都用c语言处理

不是每个信号都用c语言处理,c,unix,signals,C,Unix,Signals,我有一个小c程序,其中我使用fork创建了3个子进程: #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> void handler(int signum) { printf("SIGNAL ARRIVED\n"); } int main() { signal(S

我有一个小c程序,其中我使用fork创建了3个子进程:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void handler(int signum) {
    printf("SIGNAL ARRIVED\n");
}

int main() {
    signal(SIGTERM, handler);
    pid_t pid;
    pid_t parent = getpid();
    int i;
    for(i = 0; i < 3; i++) {
        pid = fork();
        if(pid == 0) {
        kill(parent, SIGTERM);
        exit(0);
    }
}
    while(wait(NULL) > 0) {}
    exit(0);
}
#包括
#包括
#包括
#包括
#包括
无效处理程序(int-signum){
printf(“信号到达\n”);
}
int main(){
信号(SIGTERM,处理器);
pid_t pid;
pid_t parent=getpid();
int i;
对于(i=0;i<3;i++){
pid=fork();
如果(pid==0){
kill(父项,SIGTERM);
出口(0);
}
}
while(wait(NULL)>0{}
出口(0);
}
我的预期输出是三个信号到达,但有时我只得到其中两个。
为什么会这样,我错过了什么,我怎样才能做到每次三次都能得到呢?

信号不是排队的,它们只是标志。向进程发送信号只是设置标志,如果已经设置了标志,则没有其他效果。因此,如果在进程注意到多个信号并运行信号处理程序并清除标志之前将多个信号发送到进程,则有些信号似乎“丢失”

信号没有排队,它们只是标志。向进程发送信号只是设置标志,如果已经设置了标志,则没有其他效果。因此,如果在进程发现多个信号并运行信号处理程序并清除标志之前将多个信号发送到进程,则有些信号似乎“丢失”

异步传递信号,无法保证在信号传递进程终止之前传递这些信号。如果您需要保证您的父进程实际看到并处理所有三个信号,您可以尝试同步信号处理。详见信号(7):错误代码。Read&@ChrisDodd指出,常规信号也没有排队,这是另一个可能的错误源。Linux支持所谓的可排队的“实时信号”。有关详细信息,请参阅上面的信号手册页。为什么要发送信号,更不用说SIGTERM了?有一组相当丰富的IPC可供使用(该列表可在您最喜欢的unix/linux编程书中找到)。我正在准备考试,我需要知道信号的行为,即信号是异步传递的,不能保证它们会在信号传递过程终止之前传递。如果您需要保证您的父进程实际看到并处理所有三个信号,您可以尝试同步信号处理。详见信号(7):错误代码。Read&@ChrisDodd指出,常规信号也没有排队,这是另一个可能的错误源。Linux支持所谓的可排队的“实时信号”。有关详细信息,请参阅上面的信号手册页。为什么要发送信号,更不用说SIGTERM了?有一套相当丰富的IPC可供使用(该列表在您最喜欢的unix/linux编程书中提供)。我正在准备考试,我需要知道信号的行为,就是这样