我遇到了以下存储 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 ?