Python的socket如何处理EINTR?

3 投票
1 回答
1353 浏览
提问于 2025-04-16 16:49

到目前为止,我的网络代码运行得很好,但我有点担心一个我之前忽视的问题:

关于 acceptcloseconnectrecvsend 这些函数的说明书提到,当一个系统调用被信号打断时,可能会出现 errno.EINTR 这个错误。

我对此有点无从下手。

那Python对此是怎么处理的呢?它会自动重试这个调用吗?还是会抛出一个带有这个错误码的 socket.error?如果出现了这个异常,我应该怎么做才合适?我能在我的单元测试中自己制造这些信号吗?

1 个回答

2

Python会自动重试调用,并且把信号对用户隐藏起来(这样在不同平台上表现得更一致,因为有些平台没有-EINTR这个问题)。你可以放心地忽略EINTR的问题,不过如果你想测试一下也是很简单的。只需要设置一个会一直阻塞的操作(比如用socket.accept等待连接,但没有任何连接进来),然后给这个进程发送一个信号就可以了。

撰写回答