在下面的代码中,我期待的是控制台打印十h.LineStyle='none';
。通过将SIGCHLD caught
设置为sa_flags
并使用SA_SIGINFO
代替sa_sigaction
,我已经排队了SIGCHLD。但是,似乎有些SIGCHLD丢失了。为什么呢?
我认为sa_handler
可能会被fork()
打断,因此我使用SIGCHLD
重新启动SA_RESTART
。我在不同的计算机上运行相同的代码。在我的MacBook上,它显示fork()
。在另一台Linux计算机上,打印的[1] 24481 illegal hardware instruction
不到10个。
SIGCHLD caught
答案 0 :(得分:1)
SIGCHLD
是一个标准信号,这意味着它的多次出现会折叠成一个。 Linux内核为标准信号维护一个位集,每个信号一位,并支持排队一个相关的siginfo_t
。
修正:
void catch(int signo, siginfo_t*, void*) {
int status;
pid_t pid;
if(signo == SIGCHLD) {
while((pid = waitpid(-1, &status, WNOHANG)) > 0)
printf("child %u terminated.\n", (unsigned)pid);
}
}
另请注意,除非使用SA_NODEFER
标志,否则您无需显式阻止您处理的信号,因为它会自动阻止您。
而且,迂腐地说,只有有限数量的异步信号安全功能(见man signal-safety
)可用于信号处理程序,printf
不是其中之一。