[英]reentrant function read()
我通过select()
找到了一个服务器,我想从一些客户端收到它。
但我发现服务器将被gdb阻塞在read()
。
所以我想通过添加一个SIGALRM
来解决它,但是当发生超时时,它仍然在read()
被阻塞。
发生这种情况是因为,系统调用会自动重新启动,当SIGALRM信号处理程序返回时, read()
不会中断。
这种解释是否正确?
这个问题的通常解决方案是使用SOCK_NONBLOCK
来socket(2)
或O_NONBLOCK
到fcntl(2)
的F_SETFL
命令。 一旦套接字被标记为非阻塞,当你尝试从它读取它时它永远不会阻塞,你不需要尝试跨越阻塞或非阻塞之间的鸿沟。 你确定select(2)
设置文件描述符吗? select(2)
联机帮助页确实描述了您看到所见内容的一个原因,但似乎不太可能:
在Linux下,
select()
可以将套接字文件描述符报告为“准备好读取”,而不是后续的读取块。 这可能例如在数据到达时发生但在检查时具有错误的校验和并被丢弃。 可能存在其他情况,其中虚假地报告文件描述符为就绪。 因此,在不应阻塞的套接字上使用O_NONBLOCK
可能更安全。
如果您真的只想阻止自动重启,请在sigaction(2)
查看SA_RESTART
以防止重新启动系统调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.