我找到了select()
的服务器,我想从一些客户那里收到。
但是我发现gdb会在read()
中阻止服务器。
所以我想通过添加SIGALRM
来解决它,但是
发生超时时,它仍然在read()
中被阻止。
这是因为系统调用会自动重启,read()
SIGALRM信号处理程序返回时不会中断。
这种解释是否正确?
答案 0 :(得分:2)
此问题的常见解决方案是使用SOCK_NONBLOCK
到socket(2)
或O_NONBLOCK
到fcntl(2)
的{{1}}命令。一旦套接字被标记为非阻塞,当你尝试从它读取它时它永远不会阻塞,你不需要尝试跨越阻塞或非阻塞之间的鸿沟。你确定F_SETFL
设置了文件描述符吗? select(2)
联机帮助页确实描述了您看到所见内容的一个原因,但似乎不太可能:
在Linux下,
select(2)
可能会报告套接字文件描述符为 “准备好阅读”,但随后阅读 块。例如,这可能在数据到达时发生 但经过检查有错误的校验和,并被丢弃。 可能存在文件描述符的其他情况 虚假报道准备好了。因此,使用起来可能更安全select()
应该不会阻塞的套接字。
如果您真的只是想阻止自动重启,请查看O_NONBLOCK
中的SA_RESTART
以防止重新启动系统调用。