【发布时间】:2018-01-27 21:51:27
【问题描述】:
我在我的 SIGCHLD 信号处理程序中调用 write()。
但write() 有时可能会设置errno。这会破坏我的程序吗?
我应该像下面这样保存然后恢复errno吗?
void sigchld_hanlder(int)
{
int old_errno = errno;
write(...);
errno = old_errno;
}
【问题讨论】:
-
明智的做法是在信号处理程序中尽可能少做,例如设置一个 volatile 标志,该标志将在代码的非信号处理程序部分检测到并采取相应措施。跨度>
-
@paxdiablo 我被pubs.opengroup.org/onlinepubs/9699919799/functions/… 允许使用
write()(实际上我只发送一个字节与这个写入,在同一进程中“唤醒”poll() -
我自己,我仍然会用线程来做。让信号处理程序设置一个标志,并有一个专用线程监视该标志并进行写入。这样一来,您就可以绕过一大堆可能出现的问题(例如,如果您的
write阻塞在 sig-handler 中会发生什么情况)。 -
将 errno 保存在信号处理程序中是一种常见的做法。