如何在Python中捕获EINTR?

1 投票
1 回答
1078 浏览
提问于 2025-04-17 19:29

我的问题是,由于EINTR信号的影响,在执行像select这样的系统调用时会出现错误。如果我没记错的话,这个问题在网上到处都有讨论,虽然有很多解决方案,但对我来说都不管用。

在我的多线程应用中,我使用了很多select调用(我有一个TCP服务器和一个单独的TCP客户端)。当我调用系统锁(我的应用通过gnome-screensaver-commands -lock来实现)时,随机会出现select抛出的错误:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
  File "/home/aziemek/Desktop/Zablokowanie uśpienia/server.py", line 45, in run
inputready,outputready,exceptready = select.select([self.server],[],[],TIME_TO_CHECK/2)
error: (4, 'Interrupted system call')

这是我尝试捕获EINTR的方法:

try:
    inputready,outputready,exceptready = select.select([self.client],[],[],TIME_TO_CHECK*2) 
except EnvironmentError as why:
    print("Blad ta :" + str(why.args[0]))
    if why.args and why.args[0] != EINTR:
        print("Error during server loop" + why)
    else:
        continue
except socket.error as why:
    print("Blad ta :" + str(why.args[0]))
    if why.args and why.args[0] != EINTR:
        raise
    else:
        continue
except Exception as why:
    print("Blad to :" + str(why.args[0]))
except:
    print("Blad niewiadomy")

但是没有一个“except”语句能够捕获这个异常——即使是最后两个也不行。我的系统是Linux Ubuntu,使用的是Python 2.6.5。

1 个回答

2

你想要捕捉 OSErrorselect.error 这两种错误:

import select
# ...

except (OSError, select.error) as why:
    # ...

OSError 是为了让你的代码在将来也能正常工作;而你的错误追踪信息是和 select.error 有关的。

撰写回答