C poll() 返回 ECHILD

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

刚刚遇到未记录的错误。对

poll()
的呼叫返回
ECHILD

我有一个非常简单的代码,几乎直接来自该人:

struct pollfd fds[] = { fd, POLLIN, 0 };
while(should_continue) {
  int rc=poll(fds, 1, 1000);
  if(rc==0) {
     // exit by timeout, repeat waiting
     continue;
  } else if(rc<0) {
     printf("poll error %d\n", errno);
     exit(1);
  }
  // read from fd
}

此代码突然退出并显示“轮询错误 10”。但

man 2 poll
甚至没有提到 ECHILD 可能是错误。可能是什么原因?

c errno
1个回答
0
投票

很少有东西能返回

ECHILD

因此,我怀疑你的信号处理程序会破坏

errno
。具体来说,是处理
SIGCHLD
并调用
wait
直到返回
-1

发生的事情是这样的:

  1. 您拨打
    poll
    ,它就会阻塞。
  2. 一个孩子走了出来。
  3. poll
    返回
    -1
    并带有错误
    EINTR
    ,以便让您的信号处理程序有机会运行。
  4. 您的
    SIGCHLD
    处理程序已被呼叫。
  5. 它会反复呼叫
    wait
    来收割任何等待收割的孩子。
  6. 最后一次调用
    wait
    ,没有任何收获,返回
    -1
    ,并出现错误
    ECHILD
  7. 您的
    SIGCHLD
    处理程序返回 ,而不恢复
    errno
  8. poll
    当它真正返回
    ECHILD
    时,似乎返回了错误
    EINTR

修复:

  • 调用信号处理程序时保存
    errno
    ,并在退出前恢复它。
  • 当返回
    poll
    并出现错误
    -1
    时重新启动
    EINTR
    (或者使其在信号处理后自动重新启动)。
© www.soinside.com 2019 - 2024. All rights reserved.