可重入函数read()

时间:2011-04-09 10:28:54

标签: c linux networking

我找到了select()的服务器,我想从一些客户那里收到。

但是我发现gdb会在read()中阻止服务器。

所以我想通过添加SIGALRM来解决它,但是 发生超时时,它仍然在read()中被阻止。

这是因为系统调用会自动重启,read() SIGALRM信号处理程序返回时不会中断。

这种解释是否正确?

1 个答案:

答案 0 :(得分:2)

此问题的常见解决方案是使用SOCK_NONBLOCKsocket(2)O_NONBLOCKfcntl(2)的{​​{1}}命令。一旦套接字被标记为非阻塞,当你尝试从它读取它时它永远不会阻塞,你不需要尝试跨越阻塞或非阻塞之间的鸿沟。你确定F_SETFL设置了文件描述符吗? select(2)联机帮助页确实描述了您看到所见内容的一个原因,但似乎不太可能:

  

在Linux下,select(2)可能会报告套接字文件描述符为   “准备好阅读”,但随后阅读   块。例如,这可能在数据到达时发生   但经过检查有错误的校验和,并被丢弃。   可能存在文件描述符的其他情况   虚假报道准备好了。因此,使用起来可能更安全   select()应该不会阻塞的套接字。

如果您真的只是想阻止自动重启,请查看O_NONBLOCK中的SA_RESTART以防止重新启动系统调用。