Linux中如何处理errno和signal handler?

con*_*ong 5 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;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ick 5

glibc 文档

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

所以继续这样做。

如果您正在使用 pthreads 编写多线程程序,则有一种解决方法需要更少的努力。errno将在线程本地存储中。如果您将一个线程专用于处理面向进程的信号,而在所有其他线程中阻塞该信号,则您不必担心errno信号处理程序中的分配问题。

  • 为什么几乎所有的信号处理程序都不保存 errno 并在单线程进程中恢复它?因为这些程序员只是没有考虑到这一点? (3认同)
  • 此外,手册页 signal-safety(7) 还说:“只要信号处理程序在入口处保存 errno 并在返回之前恢复其值,获取和设置 errno 的值就是异步信号安全的。” (2认同)