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