当我们编写一个可能改变errno的信号处理程序时,我们应该在信号处理程序的开头保存errno并在它结束时恢复errno吗?如下所示:
void signal_handler(int signo){
int temp_errno = errno;
*** //code here may change the errno
errno = temp_errno;
}
答案 0 :(得分:3)
glibc文档says:
调用可能设置errno或修改浮点环境的函数的信号处理程序必须保存其原始值,并在返回之前恢复它们。
所以继续这样做。
对于那些无法重写信号处理程序的人来说,可能会有一种解决方法。如果您正在使用pthreads编写多线程程序,errno
将位于线程本地存储中。因此,您可以将一个线程专用于处理信号并阻止所有其他线程中的信号。