SA_RESTART似乎对select没有影响

时间:2017-05-17 10:51:57

标签: c macos select signals

我在我的一个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,但由于我的读取函数等仍然以EINTRerrno而失败,因此似乎没有效果。

是否还有一些方法可以在OSX中使用它?

2 个答案:

答案 0 :(得分:0)

如果通过信号停止/恢复调用(“接受”)线程,看来SA_RESTARTaccept()没有任何影响。

答案 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).