C++:setsockopt() 可以被信号忽略吗?

C++: Could setsockopt() be ignored by a signal?

我正在使用使用 XML over TCP 通信的代码。此实现对每个 send()recv() 都有 10 秒超时,以等待使用 setsockopt() 的整个数据。经过一段时间的工作后,我发现有时 recv() 不会等待超时并返回 -1 值。当我试图解决这个问题时,我在代码中添加了一个 sleep(2),我发现每次遇到 recv 错误时 sleep() 都会被中断。基于此我认为问题的根源是一个信号,但我没能找到是哪个信号。

我的问题如下:recv() 的等待会被信号中断吗?注意:recv()的等待设置在setsockopt()

编辑: 这是解决方案(感谢您的帮助):

while (buf > 0)
{
  rsize = recv(socket, bufsize, buf, 0)
  if (rsize == -1)
  {
    if (errno == EINTR)
      continue;
    break;
  }
  break;
}

在 Linux(和一般的 UNIX)上,对 recv() 的调用可以通过传递信号来中断。

[EINTR] The recv() function was interrupted by a signal that was caught, before any data was available.
POSIX

如果您遇到 EINTR 或检测到比预期短的邮件大小,只需重新启动您的 recv()(根据目前已读取的字节数进行调整)。

如果您使用sigaction()建立您的信号处理程序,您可以设置SA_RESTART标志以允许系统调用在调用信号处理程序后自动重新启动。 recv() 是将在 Linux 下重新启动的调用之一(详细信息在 man 7 signal 中找到)。