Я использую python для управления некоторыми симуляторами. Я создаю параметры и запускаю программу, используя:
pipe = open('/dev/null', 'w')
pid = subprocess.Popen(shlex.split(command), stdout=pipe, stderr=pipe)
Мой код обрабатывает разные сигналы. Ctrl + C остановит симуляцию, спросит, хочу ли я сохранить и выйдет изящно. У меня есть другие обработчики сигналов (например, для принудительного вывода данных).
Я хочу отправить сигнал (SIGINT, Ctrl + C) на мой python script, который спросит пользователя, какой сигнал он хочет отправить в программу.
Единственное, что предотвращает работу кода, это то, что кажется, что что бы я ни делал, Ctrl + C будет "перенаправлен" на подпроцесс: код поймает его и выйдет:
try:
<wait for available slots>
except KeyboardInterrupt:
print "KeyboardInterrupt catched! All simulations are paused. Please choose the signal to send:"
print " 0: SIGCONT (Continue simulation)"
print " 1: SIGINT (Exit and save)"
[...]
answer = raw_input()
pid.send_signal(signal.SIGCONT)
if (answer == "0"):
print " --> Continuing simulation..."
elif (answer == "1"):
print " --> Exit and save."
pid.send_signal(signal.SIGINT)
[...]
Итак, что бы я ни делал, программа получает SIGINT, который мне нужен только для моего python script. Как я могу это сделать?
Я также пробовал:
signal.signal(signal.SIGINT, signal.SIG_IGN)
pid = subprocess.Popen(shlex.split(command), stdout=pipe, stderr=pipe)
signal.signal(signal.SIGINT, signal.SIG_DFL)
для запуска программы, но это дает тот же результат: программа ловит SIGINT.
Thanx!