(我正在使用CPython v2.6(在Linux,Windows和OSX上),但我不认为我的问题是针对Python或我的目标系统的。)
如果我的应用程序在select([sock], [], [], None)
通话中被阻止且远程方被突然终止,即使我没有选择错误,我还可以依赖我的选择呼叫解锁吗?
我知道执行这些操作的正确方法是检查套接字中的错误(例如select([sock], [], [sock], None)
),但我为select阅读的文档说错误的定义不同于系统到系统。
答案 0 :(得分:2)
我不确定这有多少可能是“依赖于实现”,因为select()的这个区域有点模糊,这取决于你如何阅读手册页,但我所使用的系统将返回套接字可读,然后你的读取将返回一个错误(这当然假定TCP和远程端有RST连接。)关键部分是“如果可以执行相应的I / O操作,描述符被认为是准备好的(例如,阅读(2))没有阻止。“如果读取立即返回错误将是一个真实的声明。我建议通过编写一个简单的客户端服务器,让客户端连接,然后选择读取来在目标系统上验证此行为。让服务器接受,睡一会儿,然后退出。如果我通常看到的是您的标准,则select将返回套接字可读,并且您的读取不会阻止,但会返回连接重置错误。
哦,是的,只是为了让事情变得更糟(来自linux man pages)
在Linux下,select()可以将套接字文件描述符报告为“准备好读取”,而不是后续的读取块。这可能例如在数据到达时发生但在检查时具有错误的校验和并被丢弃。可能存在其他情况,其中虚假地报告文件描述符为就绪。因此,在不应阻塞的套接字上使用O_NONBLOCK可能更安全。