2015-02-06 62 views
0
s = signal.signal(signal.SIGINT, signal.SIG_IGN) 
os.wait() 
signal.signal(signal.SIGINT, s) 

目前,我有上面的代码。这对我目前的工作很好,如果有人想要按疯狂的金额Ctrl+cPython计数键盘中断

但我想有一个任意计数,而不是像上面一样不断忽略它。例如,如果我收到5 Ctrl+c,我想要sys.exit()而不是让os.wait()继续前进。我如何计算ctrl+c

回答

1

signal可以接受函子:

import signal 
import sys 

class S: 
    cnt = 0 

    def __call__(self, signum, frame): 
     self.cnt += 1 
     if (self.cnt == 5): 
      sys.exit() 

signal.signal(signal.SIGINT, S()) 
+0

回溯[错误4]中断的系统调用 (最新最后调用: 文件 “一”,线730,在 os.wait() OSERROR ): 文件 “一”,线730,在 os.wait() OSERROR:[错误4]中断的系统调用 在第二CTRLç – ealeon 2015-02-06 19:54:41

+0

'os.wait()'(和许多其他的功能阻断)在任何未被忽略的中断上抛出带有errno.EINTR的OSError。你需要检查你的代码。在C语言中,可以使用'SA_RESTART',但是在Python中,这不能完成,因为Python处理信号的方式会使信号处理程序从不调用。 – StenSoft 2015-02-06 20:05:56

+0

也许我应该在它正在等待的过程中放置​​信号处理程序? – ealeon 2015-02-09 00:46:24

0

你显然需要一个变量,你增加和比较五。

编辑:我不认为你能处理的信号,但没能介绍一个Python变量,但哦:

counter = 0 
def handle_sigint(signal_number, _frame): 
    if counter >= 5: 
      sys.exit(-1) #or whatever you want 
    else: 
      counter += 1 

signal.signal(signal.SIGINT, handle_sigint) 
+0

嗯,是。我怎么做? – ealeon 2015-02-06 19:41:42

+0

回溯(最近最后调用):在第二CTRLÇ – ealeon 2015-02-06 19:53:31