【发布时间】:2019-07-08 07:11:28
【问题描述】:
我已经制作了这个程序,到目前为止的输出对我来说没有多大意义。有人可以解释发生了什么吗?
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 个终止信号,父进程和子进程都在使用我的自定义处理程序,但不知何故其中一个没有使用该处理程序,或者在收到两次信号后没有收到终止信号(它可以解释为什么只当我在 2 个 kill 系统调用之后添加另一个 kill 系统调用时,会打印一个 A)。
【问题讨论】:
-
您不能在信号处理程序中安全地调用
printf()。每footnote 188 of the C standard:“因此,信号处理程序通常不能调用标准库函数。” POSIX allows you to call async-signal-safe functions 来自信号处理程序,但printf()不是异步信号安全的。 -
最好使用
sigaction而不是signal。当信号发生时,信号处理程序可能会被重置。 POSIX.1 允许这种依赖于实现的行为。
标签: c operating-system signals system-calls signal-handling