python KeyboardInterrupt doubletaps

时间:2014-07-10 13:52:46

标签: python

我在Python 2.7下的程序(在Linux上)具有以下内容:

signal.signal(signal.SIGINT,self.stop)    # CTRL-C stop (-INT TERM)
signal.signal(signal.SIGUSR1,self.pause)  # pause
signal.signal(signal.SIGUSR2,self.resume) # resume
signal.signal(signal.SIGTERM,self.stop)   # stop

这些都可以使用kill-pid按预期工作。但是如果在执行期间我按下CTRL-C,则会调用stop函数两次。

我甚至尝试过捕获KeyboardInterrupt异常,但它永远不会被调用。

我的停止函数会引发异常,如果它被调用了两次,我现在已经注释掉了,但我宁愿让这个运行没有变通方法。

有什么想法吗?

INT和TERM的信号处理程序

def stop(self,signum=None,stack=None):
    if self._state == WASP_RUNNING or self._state == WASP_PAUSED:
        logging.info("**** Stopping Wasp ****")
        self._halt.set()
    else:
        raise WaspRuntimeException, "Wasp state %d not valid for stop" % self._state

以上调用WaspRuntimeException时调用两次。我还添加了印刷语句来证实这一点。

整个计划很冗长​​。下面是启动功能,希望是重要的部分。 init 仅将所有内部变量设置为None。函数_create(),读取配置文件,创建Event _halt,在监控模式下创建虚拟无线网络,创建一个子进程(现在)扫描器每隔100ms左右设置无线nic通道。函数_destroy()会破坏虚拟内核,向扫描程序发送一个毒丸,并等待它加入。

def start(self):
    signal.signal(signal.SIGINT,self.stop)    # CTRL-C stop
    signal.signal(signal.SIGUSR1,self.pause)  # pause
    signal.signal(signal.SIGUSR2,self.resume) # resume
    signal.signal(signal.SIGTERM,self.stop)   # stop

    logging.info("**** Starting Wasp ****")
    self._create()
    self._state = WASP_RUNNING
    while not self._halt.is_set():
        if self._state == WASP_RUNNING:
            if self._err.has_key('scanner'):
                logging.error("Scanner failed. (%s) %s",self._err['scanner'][0],\
                                                        self._err['scanner'][1])
                self._state = WASP_INVALID
                self._halt.set()
                continue
        time.sleep(1)
    self._destroy()

该程序被称为:

if __name__ == 'wasp':
    w = None
    try:
        logging.info("Wasp %s",__version__)
        w = Wasp()
        w.start()
    except WaspConfException, e: # w failed to start, no need to stop
        logging.error("Configuration Error: %s",e)
    except WaspParamException, e:
        logging.error("Parameter Error: %s",e)
        if w and (w.state() == WASP_RUNNING or w.state() == WASP_PAUSED): w.stop()
    except WaspRuntimeException, e:
        logging.error("Runtime Error: %s",e)
        if w and (w.state() == WASP_RUNNING or w.state() == WASP_PAUSED): w.stop()
    except WaspException, e:
        logging.error("General Error: %s",e)
        if w and (w.state() == WASP_RUNNING or w.state() == WASP_PAUSED): w.stop()
    except Exception, e:
        logging.exception("Unknown Error: %s",e)
        if w and (w.state() == WASP_RUNNING or w.state() == WASP_PAUSED): w.stop()

state函数只返回一个内部变量

我原本以为它可能是被调用的例外,从而导致再次调用停止。但是,没有记录任何内容。我添加了上面显示的状态检查以确保。

0 个答案:

没有答案