带有子进程的Python程序在CTRL + C上终止子进程但在sys.exit()上没有终止子进程

时间:2013-06-29 19:22:41

标签: python multiprocessing termination sigint

我正在为多进程UDP服务器编写测试工具。测试工具运行多个子进程 - 包括几个生成UDP服务器实例的子进程。我无法在退出时终止子进程并从内部退出程序 - 唯一有效的是来自终端的CTRL + C,它会杀死子进程并很好地停止程序。

我有几个相关的问题:

  1. 如果我在信号处理程序中或在触发信号后使用sys.exit(),程序不会退出。它看起来像是命中退出代码,然后挂起。
  2. 如果我使用p.terminate()os.kill(p, SIGINT
  3. ,程序不会终止子流程
  4. 如果我使用os._quit()
  5. ,程序不会终止子进程

    同样,如果我只是让程序继续运行并从终端类型CTRL + C,程序立即停止,带有所有子进程。在程序中执行此操作的最佳方法是什么?


    我在节目结束时尝试了什么

    os.kill(os.getpid(), signal.SIGINT)
    

    信号处理程序

    # handle ctrl+c and remove open files
    def signal_handler(signal, frame):
        print 'You pressed Ctrl+C!'
        # remove all files
        try:
            filelist = [ f for f in os.listdir(tmpdir) ]
            for f in filelist: os.remove(tmpdir+'/'+f)
            # remove dir
            os.rmdir(tmpdir)
        except:
            print "unable to remove temporary directory/files:", tmpdir
        print "attempt sys.exit()"
        sys.exit() # This doesn't do anything, program hangs
        # os._exit(0) # This stops program, but doesn't kill subprocesses
    
    signal.signal(signal.SIGINT, signal_handler)
    

0 个答案:

没有答案