我在SIGCHLD信号处理程序中调用write()
。
但write()
有时会设置errno
。这会破坏我的计划吗?
我应该像以下一样保存并恢复errno
吗?
void sigchld_hanlder(int)
{
int old_errno = errno;
write(...);
errno = old_errno;
}
答案 0 :(得分:1)
将一个字符写入管道是从信号处理程序到轮询循环进行通信的一种常用方法。是的,您应该[1]保存errno并将其还原到信号处理程序中。将正在写入的管道(或其他文件描述符)置于NON BLOCKING模式也是一个好主意,这样写调用就不会阻塞(如果在某个线程有机会执行之前多次调用信号处理程序,可能会发生这种情况阅读)。
signalfd是另一种安全地将信号传递到轮询循环的方法。
[1] https://www.gnu.org/software/libc/manual/html_node/POSIX-Safety-Concepts.html