SA_RESTART似乎对select没有影响

问题描述 投票:0回答:2

我正在我的一个 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 上也能工作吗?

c macos signals posix-select
2个回答
1
投票

对于 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).

1
投票

如果调用(“接受”)线程通过信号停止/恢复,则

SA_RESTART
似乎不会对
accept()
产生任何影响。

© www.soinside.com 2019 - 2024. All rights reserved.