信号 SIGINT (CTRL+C) 等待程序完成以出现异常并调用给定的处理程序 (Python3 + Libpcap)

问题描述 投票:0回答:1

自己尝试了一段时间后,我找不到任何解决方案,并且互联网资源似乎没有帮助。

我试图使用 CTRL+C 按键在 Linux 中停止由命令行调用的 python3 脚本,遗憾的是它似乎不起作用。

在我调用 libpcap 函数后,程序应该停止:

myInt = libpcap.next_ex(pcap_t_my, ctypes.byref(pcap_pkthdr), ctypes.byref(pcap_pkt_data))

该函数接收一个结构,其中包含一个名为 time out 的参数/变量。我将其设置为 24000 毫秒,以便试验 libpcap 函数。

看来,当程序运行 libpcap.next_ex 函数时,使用 python3 的信号库来中断该函数以停止程序是不可能的。尽管如此,它还是会读取信号并在超过超时值后执行对处理程序的调用。

我的一些代码:

#Signal Handler fro CTRL+C
def shutDown_Handler(signal,frame):
    print("Program aborting by system handles KeyboardInterrupt...")
    SetDownProgram()
    print("Program aborted by system handles KeyboardInterrupt")
    sys.exit(0)


if __name__==  "__main__":
    ...
    signal.signal(signal.SIGINT, shutDown_Handler)
    try:
        ...
        
    except KeyboardInterrupt:
        print("Program aborting...")
        SetDownProgram()
        print("Program aborted")
    
    else:
        print("Program finished as planned")
    

问题是.. 如何在运行 python3 脚本的控制台中按 CTRL+C 后程序立即结束?

只需提及我正在使用 python 环境运行 python3 脚本。 作为: /home/$USER/Documents/myPyEnv/bin/python3

它会影响你调用SIGINT中断的方式吗?只需提及程序会读取它,但在设置的超时时间结束之前不会影响其行为。

python signals interrupt libpcap sigint
1个回答
0
投票

好吧...我用Python中的线程解决了这个问题。 对于任何阅读我如下问题并且似乎有效的人:

  1. 我导入了“线程”库:
    import threading
  1. 我创建了一个包含函数的新线程,该函数调用 libpcap 函数 libpcap.netx_ex() 并将其作为非守护进程服务启动。
    threading.Thread(target=NormalFunction, daemon=False).start()

或者:

    NormalFunctionThread = threading.Thread(target=NormalFunction, daemon=False)
    NormalFunctionThread.start()
  1. 我修改了信号处理程序,以便在发送 CTRL+c/SIGNINT 时不显示回溯。
    #Signal Handler fro CTRL+C

    def shutDown_Handler(signal,frame):
        print("Program aborting by system handles KeyboardInterrupt...")
        SetDownProgram()
        print("Program aborted by system handles KeyboardInterrupt")
        #sys.exit("Program aborted.")
        #os._exit in order to do not show traceback
        os._exit(0)

现在它按预期工作了! :D

如有任何改进或注释,我们将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.