kill会被一个信号打断吗?

Will kill be interrupted by a signal?

例如,如果我使用 kill(C 库 signal.h 中的函数)向 child 发出 SIGINT 信号,来自 child 的 SIGCHLD 信号是否会被捕获在 kill 函数之前 returns?

我不知道这是否回答了您的问题,但是,阅读 Linux 手册页,kill 的可能 return 值是 EINVALEPERM,和 ESRCHEINTR 不是其中之一。这让我认为该功能不会被中断。至少,系统调用不会被打断。

编辑:我的意思是 errno,而不是 return,值。

信号处理是异步的。因此,无法保证在 kill 调用 return 之前,父进程是否会收到子进程终止时发出的 SIGCHLD。我的猜测是 kill 通常会 赢得比赛, return 在 SIGCHLD 到达之前,但依赖于此并不安全。

虽然 kill 系统调用不可中断(至少根据 the man page),但至少在两种情况下 SIGCHLD 处理程序可以 运行在函数 returns:

之前
  1. 如果您的进程中有另一个线程,内核甚至可以在第一个线程中 kill 系统调用 returns 之前选择 运行 那里的信号处理程序。
  2. 您可能正在使用来自您的 libc 的 kill 的包装函数。信号处理程序可以 运行 在系统调用返回到它和它返回到您的代码之间。

所以如果你想确保在 kill returns 之前你没有得到 SIGCHLD,那么你需要在 sigprocmask 之前阻止它kill,直到你准备好为止。