【问题标题】:How to deal with errno and signal handler in Linux?Linux中如何处理errno和信号处理程序?
【发布时间】:2018-06-30 21:14:54
【问题描述】:

当我们编写一个可能会改变errno的信号处理器时,我们是否应该在信号处理器的开头保存errno并在其末尾恢复errno?就像下面这样:

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

【问题讨论】:

    标签: linux signals signal-handling


    【解决方案1】:

    glibc 文档says:

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

    所以继续做吧。

    如果您正在使用 pthreads 编写多线程程序,那么有一种解决方法可以减少工作量。 errno 将在线程本地存储中。如果你用一个线程来处理进程导向的信号,阻塞所有其他线程中的信号,你就不必担心在信号处理程序中分配给errno

    【讨论】:

    • 为什么几乎所有的信号处理程序都不保存 errno 并在单线程进程中恢复它?因为这些程序员根本没有考虑到这一点?
    • 此外,手册页 signal-safety(7) 说:“获取和设置 errno 的值是异步信号安全的,前提是信号处理程序在输入时保存 errno 并在之前恢复其值回来了。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多