Python的socket如何处理EINTR?
到目前为止,我的网络代码运行得很好,但我有点担心一个我之前忽视的问题:
关于 accept
、close
、connect
、recv
和 send
这些函数的说明书提到,当一个系统调用被信号打断时,可能会出现 errno.EINTR
这个错误。
我对此有点无从下手。
那Python对此是怎么处理的呢?它会自动重试这个调用吗?还是会抛出一个带有这个错误码的 socket.error?如果出现了这个异常,我应该怎么做才合适?我能在我的单元测试中自己制造这些信号吗?
1 个回答
2
Python会自动重试调用,并且把信号对用户隐藏起来(这样在不同平台上表现得更一致,因为有些平台没有-EINTR这个问题)。你可以放心地忽略EINTR的问题,不过如果你想测试一下也是很简单的。只需要设置一个会一直阻塞的操作(比如用socket.accept等待连接,但没有任何连接进来),然后给这个进程发送一个信号就可以了。