我正在开发一个用Python生成shell的项目,其中一个重要特性是能够暂停和后台运行的子进程。然而,我发现暂停子进程的唯一方法似乎立即将其删除,因此我以后无法恢复它。 我们小组尝试过除KeyboardInterrupt之外:
try:
process = subprocess.Popen(processName)
process.communicate()
except KeyboardInterrupt:
print "control character pressed"
并使用信号:
def signal_handler(signal,frame):
print 'control character pressed'
signal.signal(signal.SIGINT, signal_handler)
process.communicate()
另一个问题是这两个都只在按下Ctrl-C时有效,没有其他任何效果(我想这就是为什么子进程被杀死了)。
答案 0 :(得分:1)
你让进程死亡的原因是因为你允许Ctrl + C到达子进程。如果您使用参数preexec_fn = os.setpgrp
作为Popen
调用的一部分,则子项将设置为与父项不同的进程组。
Ctrl + C将SIGINT发送到完整的进程组,但由于子进程位于不同的进程组,因此它不会收到SIGINT,因此不会死亡。
之后,send_signal()
函数可用于在想要暂停时将SIGSTOP发送到子进程,并使用SIGCONT来恢复它。