subprocess.Popen相比于os.system()多了很多可控制的参数,用起来更灵活。这里记录两段代码,一段是超时退出仿真,另一段代码是检测到Ctrl-C后自动结束所有的仿真进程。
遇到的坑:在shell=True时,p.kill()、p.terminate()会失效。看起来只是把shell进程给结束掉了,shell的子进程ncsim却还在。
经过大神的帮助和查阅stackoverflow相关帖子后,找到下面一个可行的方案。简单来说就是用process group,把所有进程、子进程全总绑定到session_id。
使用时需要注意以下几点:
shell=True
preexec_fn=os.setsid
os.killpg(os.getpgid(p.pid), signal.SIGTERM)
代码如下:
其实方法就是上面的process group。在except KeyboardInterrupt里发送signal.SIGTERM就可以了。
这个方法也适用于结束multiprocessing.pool启动的子进程。
multiprocessing相关的内容可以参考这里:multiprocessing在并行仿真中的应用
分享数字集成电路设计中的经验和方法。分享让工作更轻松。