【发布时间】:2016-07-27 16:47:18
【问题描述】:
当父进程被 cntrl-D(标准输入上的 EOF)杀死时,我试图停止作为子进程的服务器。我尝试了很多方法,包括在子进程中读取标准输入,但这会阻止所有键盘输入。当父进程遇到EOF时,有没有办法杀死子进程。
通过subprocess.Popen在python中创建子进程
通过以下方式轮询子进程中的 EOF:
self.t = threading.Thread(target=self.server.serve_forever)
self.t.start()
# quit on cntrl-d (EOF)
while True:
if len(sys.stdin.readline()) == 0:
self.stop()
def stop(self):
manager.save()
# shutdown bottle
self.server.shutdown()
# close socket
self.server.server_close()
self.t.join()
sys.exit()
【问题讨论】:
-
让父进程向子进程发出信号,表明该退出了。
-
@thatotherguy 当用户用 control-d 强行退出父进程时不起作用,那里没有信号传播。
-
Ctrl-D 不是强制退出。在您的 sn-p 中,您似乎已明确编码以检测 eof 并退出,因为。只需向孩子发出信号,它应该作为其中的一部分退出,例如使用 Python 的线程事件。
-
@thatotherguy 上面的代码在子进程中。我无权访问父进程。我正在尝试检测父进程中发生的 control-D,以便我可以在子进程中使用 stop() 处理它
-
啊。处理这个是父进程的工作,但由于它作为父进程失败了,你可以例如循环直到
os.getppid()为1,表示父进程已经退出,你已经被重新分配给init了。
标签: python linux subprocess