我正在我的一个 OSX 程序中使用 select 来观看一些文件描述符。我遇到了 Linux 上子进程的问题,select 可能会因
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 上也能工作吗?
对于 Linux,SA_RESTART 对 select(2) 没有影响。请参阅 signal(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).
如果调用(“接受”)线程通过信号停止/恢复,则
SA_RESTART
似乎不会对 accept()
产生任何影响。