我遇到了以下信号处理程序代码,它存储 errno 变量,以便它不会影响主线程的 errno 处理。
void myhandler(int signo)
{
int esaved;
esaved = errno;
write(STDOUT_FILENO, "Got a signal\n", 13);
errno = esaved;
}
但这真的能达到目的吗?如果另一个线程在 write() 之后和恢复 errno 之前检查共享 errno 变量,会发生什么?该线程会由于竞争条件而获得错误的 errno 值吗?
或者执行信号处理程序原子地相对于线程/进程,这样一旦信号处理程序执行,内核就不会调度线程,直到信号处理程序完成?
换句话说 - 一旦启动,信号处理程序是否会执行而不会被以下情况中断:
- 1) Scheduler (process/threads), or
- 2) Other signals, or
- 3) Hardware interrupt handlers ?
信号处理程序确实可以被另一个信号中断(假设它与首先调用处理程序的信号不是同一信号)。
您的处理程序仍然可以通过传递另一种信号来中断。为了避免这种情况,您可以使用传递给 sigaction 的操作结构的 sa_mask 成员来显式指定在信号处理程序运行时应阻止哪些信号。这些信号是除了调用处理程序的信号以及通常被进程阻止的任何其他信号之外的信号。请参阅处理程序的阻塞。
当处理程序返回时,阻塞信号集将恢复到处理程序运行之前的值。因此,在处理程序内部使用 sigprocmask 只会影响处理程序本身执行期间可以到达的信号,而不影响处理程序返回后可以到达的信号。
http://www.gnu.org/software/libc/manual/html_node/Signals-in-Handler.html#Signals-in-Handler http://www.gnu.org/software/libc/manual/html_node/Signals-in-Handler.html#Signals-in-Handler
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)