kill会被一个信号打断吗?
Will kill be interrupted by a signal?
例如,如果我使用 kill(C 库 signal.h 中的函数)向 child 发出 SIGINT 信号,来自 child 的 SIGCHLD 信号是否会被捕获在 kill 函数之前 returns?
我不知道这是否回答了您的问题,但是,阅读 Linux 手册页,kill
的可能 return 值是 EINVAL
、EPERM
,和 ESRCH
。 EINTR
不是其中之一。这让我认为该功能不会被中断。至少,系统调用不会被打断。
编辑:我的意思是 errno
,而不是 return,值。
信号处理是异步的。因此,无法保证在 kill
调用 return 之前,父进程是否会收到子进程终止时发出的 SIGCHLD
。我的猜测是 kill
通常会 赢得比赛, return 在 SIGCHLD
到达之前,但依赖于此并不安全。
虽然 kill
系统调用不可中断(至少根据 the man page),但至少在两种情况下 SIGCHLD
处理程序可以 运行在函数 returns:
之前
- 如果您的进程中有另一个线程,内核甚至可以在第一个线程中
kill
系统调用 returns 之前选择 运行 那里的信号处理程序。
- 您可能正在使用来自您的 libc 的
kill
的包装函数。信号处理程序可以 运行 在系统调用返回到它和它返回到您的代码之间。
所以如果你想确保在 kill
returns 之前你没有得到 SIGCHLD
,那么你需要在 sigprocmask
之前阻止它kill
,直到你准备好为止。
例如,如果我使用 kill(C 库 signal.h 中的函数)向 child 发出 SIGINT 信号,来自 child 的 SIGCHLD 信号是否会被捕获在 kill 函数之前 returns?
我不知道这是否回答了您的问题,但是,阅读 Linux 手册页,kill
的可能 return 值是 EINVAL
、EPERM
,和 ESRCH
。 EINTR
不是其中之一。这让我认为该功能不会被中断。至少,系统调用不会被打断。
编辑:我的意思是 errno
,而不是 return,值。
信号处理是异步的。因此,无法保证在 kill
调用 return 之前,父进程是否会收到子进程终止时发出的 SIGCHLD
。我的猜测是 kill
通常会 赢得比赛, return 在 SIGCHLD
到达之前,但依赖于此并不安全。
虽然 kill
系统调用不可中断(至少根据 the man page),但至少在两种情况下 SIGCHLD
处理程序可以 运行在函数 returns:
- 如果您的进程中有另一个线程,内核甚至可以在第一个线程中
kill
系统调用 returns 之前选择 运行 那里的信号处理程序。 - 您可能正在使用来自您的 libc 的
kill
的包装函数。信号处理程序可以 运行 在系统调用返回到它和它返回到您的代码之间。
所以如果你想确保在 kill
returns 之前你没有得到 SIGCHLD
,那么你需要在 sigprocmask
之前阻止它kill
,直到你准备好为止。