【问题标题】:errno is signal handlererrno 是信号处理程序
【发布时间】:2018-01-27 21:51:27
【问题描述】:

我在我的 SIGCHLD 信号处理程序中调用 write()

write() 有时可能会设置errno。这会破坏我的程序吗?

我应该像下面这样保存然后恢复errno吗?

void sigchld_hanlder(int)
{
  int old_errno = errno;
  write(...);
  errno = old_errno;
}

【问题讨论】:

标签: linux unix signals


【解决方案1】:

将一个字符写入管道是从信号处理程序与轮询循环进行通信的常用方法。是的,您应该[1] 保存 errno 并将其恢复到信号处理程序中。将您正在写入的管道(或其他文件描述符)置于非阻塞模式也是一个好主意,这样写调用就不会阻塞(如果在某个线程有机会之前多次调用信号处理程序时可能会发生这种情况)阅读)。

signalfd 是另一种将信号安全地传递到轮询循环的方法。

[1]https://www.gnu.org/software/libc/manual/html_node/POSIX-Safety-Concepts.html

【讨论】:

    猜你喜欢
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2017-11-13
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    相关资源
    最近更新 更多