暂停键盘输入中的 Python 子进程,而不终止子进程



我正在做一个用Python生成shell的项目,一个重要的功能是能够暂停和后台运行正在运行的子进程。但是,我发现暂停子进程的唯一方法似乎会立即杀死它,所以我以后无法恢复它。我们小组已经尝试了除键盘中断之外:

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 时才有效,其他任何效果都不起作用(我想这就是子进程被杀死的原因)。

进程死亡的原因是允许 Ctrl+C 访问子进程。如果要使用参数 preexec_fn = os.setpgrp 作为Popen调用的一部分,则子进程组将设置为与父进程组位于不同的进程组中。

Ctrl+C 将 SIGINT 发送到完整的进程组,但由于子进程位于不同的进程组中,因此它不会接收 SIGINT,因此不会死亡。

之后,send_signal()函数可用于在您想要暂停子进程时向子进程发送 SIGSTOP,并使用 SIGCONT 恢复它。

相关内容

  • 没有找到相关文章

最新更新