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



当我们编写一个可能更改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

最新更新