我在我的一个OSX程序中使用select来观看一些文件描述符。我遇到了Linux上的子进程问题,选择可能会因errno
设置为EINTR
而失败。在Linux上我使用
struct sigaction sa;
::memset(&sa, 0, sizeof(sa));
sa.sa_handler = child_death_signal_handler;
sa.sa_flags = SA_RESTART;
sigaction(SIGCHLD, &sa, NULL);
设置SA_RESTART
标志,以消除Linux上的问题。但是在OSX上,在联机帮助页中提到了SA_RESTART
,但由于我的读取函数等仍然以EINTR
为errno
而失败,因此似乎没有效果。
是否还有一些方法可以在OSX中使用它?
答案 0 :(得分:0)
如果通过信号停止/恢复调用(“接受”)线程,看来SA_RESTART
对accept()
没有任何影响。
答案 1 :(得分:-1)
对于Linux,SA_RESTART对select(2)没有影响。有关信号(7),请参见联机帮助页:
The following interfaces are never restarted after being interrupted
by a signal handler, regardless of the use of SA_RESTART;
they always fail with the error EINTR when interrupted by a signal
handler:
...
* File descriptor multiplexing interfaces: epoll_wait(2),
epoll_pwait(2), poll(2), ppoll(2), select(2), and pselect(2).