2013-02-07 79 views
0
所中断

我有以下代码段:蟒选择不是由SIGCHLD

try: 
    r_l, w_l, e_l = select.select([connection_fd], [], [], timeout_secs) 
except select.error as (err_no, msg): 
    # get interrupted on select 

虽然我的程序等待在此,如果有一个信号(如SIGCHLD),选择与中断select.error 。 但是,即使我在输入select之前有未决信号,我也不确定这是否正常工作? (connection_fd套接字设置为阻塞)。

是否存在未决信号的可能性,但选择仍然不会中断?

+1

什么叫“挂起信号输入选择之前”的意思是OS信号为低电平时,他们?只是在到达时被传递到应用程序,没有队列,没有挂起的(据我所知,纠正我,如果我错了) - 这样你或者收到SIGCHLD _before_选择并处理它(通过你自己或可能默认的信号处理程序)或在输入select后接收它,无论如何没有这样的挂起信号...... –

+0

本周早些时候我遇到了这个问题如果你明确地为SIGCHLD设置了一个信号处理程序,select.select调用将会中断,所以我添加了一个条件它会检查是否定义了SIGCHLD处理程序,并在需要时设置无操作假处理程序。 –

回答

0

好点。它使我现在认为信号在Python上被破坏了:-(

VB9-UANIC:在Python中有一个“未决信号”的概念,因为在C级调用信号处理程序时,它只设置一个标志将在稍后的安全点进行检查,Python级信号处理程序(如果有的话)仅在以后从这些安全点之一调用

这意味着如果我们不幸并且信号刚刚到达C代码调用“select”系统调用,然后调用C级信号处理程序并设置该标志,但随后C代码将恢复并调用“select”---不会中断,因为没有信号离开

如果有它表明信号在Python中不是可靠的通信手段。我甚至不看它如何能是固定的,顺便说一句:-(

编辑:这是http://bugs.python.org/issue5315