我正在使用通过 TCP 通信使用 XML 的代码。此实现对每个 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
中找到)。
关于C++:setsockopt() 可以被信号忽略吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31794928/