如何处理Linux中的errno和信号处理程序?

时间:2018-01-22 09:22:46

标签: linux signals signal-handling

当我们编写一个可能改变errno的信号处理程序时,我们应该在信号处理程序的开头保存errno并在它结束时恢复errno吗?如下所示:

void signal_handler(int signo){
    int temp_errno = errno;
    *** //code here may change the errno
    errno = temp_errno;
}

1 个答案:

答案 0 :(得分:3)

glibc文档says

  

调用可能设置errno或修改浮点环境的函数的信号处理程序必须保存其原始值,并在返回之前恢复它们。

所以继续这样做。

对于那些无法重写信号处理程序的人来说,可能会有一种解决方法。如果您正在使用pthreads编写多线程程序,errno将位于线程本地存储中。因此,您可以将一个线程专用于处理信号并阻止所有其他线程中的信号。