我正在为多进程 UDP 服务器编写测试工具。测试工具运行多个子进程——包括几个产生 UDP 服务器实例的子进程。我在退出时终止子进程和从内部退出程序都遇到了麻烦——唯一有效的是终端的 CTRL+C,它会杀死子进程并很好地停止程序。
我有几个相关的问题:
sys.exit()
如果我在信号处理程序中或在我触发信号后使用 ,程序不会退出。看起来它遇到了退出代码,然后挂起。- 如果我使用
p.terminate()
或os.kill(p, SIGINT
- 如果我使用该程序不会终止子进程
os._quit()
同样,如果我只是让程序运行并从终端键入 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)