我做了这个程序,到目前为止输出对我来说没有多大意义。有人能解释一下发生了什么事吗?

void handler1a(int x){
    printf("A\n");
}

int main(){
    signal(SIGUSR1, handler1a);
    int p = fork();
    if(p==0)
    {
        sleep(5);
        printf("L \n");
    }
    else
    {
        kill(0,SIGUSR1);
        kill(0,SIGUSR1);
        kill(0,SIGUSR1);
        //kill(0,SIGUSR1);
        wait(NULL);
    }
}

有3个杀伤信号,我的输出是-5A和1L。有2个杀伤信号,输出是-4A和1L。有4个杀伤信号,输出是-6A和1L。好像有2个杀伤信号,父进程和子进程都在使用我的自定义处理程序,但不知何故其中一个进程没有使用该处理程序,或者在已经两次收到kill信号后没有收到kill信号(这将解释为什么在两次kill系统调用后添加另一个kill系统调用时只打印一个a)。

最佳答案

信号没有排队。因此,如果你多次向一个进程发送相同的信号,它可能会被处理任意次数,从1到你发送信号的次数。
或者,换言之,对于处理和信号的每个组合,信号可以处于有信号状态。如果在进程已经处于该信号的信号状态时向该进程发送信号,则不会发生任何事情。
进程不能有两个SIGUSR1信号挂起。SIGUSR1要么挂起,要么不挂起。

关于c - C语言中kill系统调用的歧义行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54687349/

10-11 04:05
查看更多