Приостановка подпроцессов Python при вводе с клавиатуры без уничтожения подпроцесса

Я работаю над проектом по созданию оболочки на Python, и одной из важных функций является возможность приостанавливать и запускать запущенный подпроцесс. Однако единственные методы, которые я нашел для приостановки подпроцесса, по-видимому, мгновенно убивают его, поэтому я не могу возобновить его позже. Наша группа попыталась исключить 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, больше ничего не действует (я думаю, именно поэтому подпроцессы убиваются).


person user2976718    schedule 11.11.2013    source источник
comment
что вы подразумеваете под паузой. Приостанавливается ли он, как в случае с сигналами SIGSTOP/SIGCONT (см. Задания и сеансы)?   -  person jfs    schedule 12.11.2013


Ответы (1)


Причина, по которой процесс умирает, заключается в том, что вы позволяете Ctrl + C достигать подпроцесса. Если вы должны были использовать параметр preexec_fn = os.setpgrp как часть вызова Popen, то дочерний процесс будет находиться в другой группе процессов, отличной от родительской.

Ctrl+C отправляет SIGINT всей группе процессов, но, поскольку дочерний процесс находится в другой группе процессов, он не получает SIGINT и, следовательно, не умирает.

После этого функцию send_signal() можно использовать для отправки SIGSTOP дочернему процессу всякий раз, когда вы хотите его приостановить, и SIGCONT для его возобновления.

person Jay Bosamiya    schedule 15.06.2015