当我们编写一个可能更改errno的信号处理程序时,我们是否应该在信号处理程序的开头保存errno,并在信号处理程序的末尾恢复errno?就像下面一样:
void signal_handler(int signo){
int temp_errno = errno;
*** //code here may change the errno
errno = temp_errno;
}
glibc 文档说:
调用可能设置 errno 或修改浮点环境的函数的信号处理程序必须保存其原始值,并在返回之前还原它们。
所以继续这样做。
如果您使用 pthreads 编写多线程程序,则有一种解决方法需要更少的努力。 errno
将位于线程本地存储中。如果将一个线程专用于处理进程导向的信号,从而阻止所有其他线程中的信号,则不必担心在信号处理程序中分配要errno
。