例如,如果我使用kill(C库signal.h中的一个函数)向子程序发出一个SIGINT信号,在kill函数返回之前,子程序发出的SIGCHLD信号是否会被捕获?
当 kill
syscall是不可中断的(至少根据 人页),仍有至少两种情况下,在这两种情况下。SIGCHLD
处理程序可以在函数返回之前运行。
kill
syscall在你的第一个线程中返回。kill
从你的libc。信号处理程序可以在syscall返回到它和它返回到你的代码之间运行。所以,如果你想确保你不会得到的 SIGCHLD
直到 kill
返回,那么你需要使用 sigprocmask
阻止它之前的 kill
直到你准备好。
信号处理是异步的。 因此,无论哪种方式,都不能保证是否会有 SIGCHLD
子女终止时发出的消息,将由父方在 kill
调用返回。 我的猜测是 kill
会 平时 夺标而归 SIGCHLD
到达,但依赖这个是不安全的。
我不知道这是否回答了你的问题,但是,在阅读Linux手册的时候,可能的返回值是 kill
是 EINVAL
, EPERM
和 ESRCH
. EINTR
不是其中之一。 这让我觉得这个函数不会被中断。 至少,系统调用不会被中断。
编辑:我的意思是 errno
,而不是返回,值。