Мой скрипт python перехватывает сигнал SIGINT сигналом
процесс
модуль для предотвращения преждевременного выхода, но этот сигнал передается подпроцессу, который я открываю с помощью Popen. есть ли способ предотвратить передачу этого сигнала в подпроцесс, чтобы он также не вышел преждевременно, когда пользователь нажимает ctrl-c?Как остановить передачу SIGINT на подпроцесс в python?
ответ
Вы можете повторно назначить роль ctrl-c с помощью модуля tty
, который позволяет вам манипулировать назначением сигналов. Однако имейте в виду, что, если вы не вернете их так, как они были до того, как вы их измените, они будут сохраняться для всей сессии оболочки даже после выхода программы.
Вот простой фрагмент кода, чтобы вы начали, сохраняя старые настройки tty, переустанавливая ctrl-c на ctrl-x, а затем восстанавливая предыдущие настройки tty после выхода.
import sys
import tty
# Back up previous tty settings
stdin_fileno = sys.stdin.fileno()
old_ttyattr = tty.tcgetattr(stdin_fileno)
try:
print 'Reassigning ctrl-c to ctrl-x'
# Enter raw mode on local tty
tty.setraw(stdin_fileno)
raw_ta = tty.tcgetattr(stdin_fileno)
raw_ta[tty.LFLAG] |= tty.ISIG
raw_ta[tty.OFLAG] |= tty.OPOST | tty.ONLCR
# ^X is the new ^C, set this to 0 to disable it entirely
raw_ta[tty.CC][tty.VINTR] = '\x18'
# Set raw tty as active tty
tty.tcsetattr(stdin_fileno, tty.TCSANOW, raw_ta)
# Dummy program loop
import time
for _ in range(5):
print 'doing stuff'
time.sleep(1)
finally:
print 'Resetting ctrl-c'
# Restore previous tty no matter what
tty.tcsetattr(stdin_fileno, tty.TCSANOW, old_ttyattr)
обработчики сигналов наследуются при запуске подпроцесс, так что если вы используете модуль сигнала игнорировать SIGINT (signal.signal(signal.SIGINT, signal.SIG_IGN)
), то ваш дочерний процесс автоматически будет также.
Есть два важных предостережений, хотя:
- Вы должны установить игнорировать обработчик перед тем вы икру дочерний процесс
- Пользовательские обработчики сигналов сбрасываются на обработчики по умолчанию, так как дочерний процесс не будет иметь доступ к коду обработчика для его запуска.
Так что, если вам нужно настроить обработку SIGINT, а не просто игнорируя его, вы, вероятно, хотите, чтобы временно игнорировать SIGINT в то время как вы икру свой дочерний процесс, а затем (пере) установить свой собственный обработчик сигнала.
Если вы пытаетесь поймать SIGINT и установить флаг, чтобы вы могли выйти в безопасном месте, а не сразу, помните, что когда вы доберетесь до этой безопасной точки, вашему коду придется вручную очистить своих потомков, так как ваш дочерний процесс и любые запущенные процессы будут игнорировать SIGINT.
Если это работает (что не всегда), это лучший вариант, чем сбрасывание терминала. – zwol
Если вы используете fork()/exec() вместо popen(), вы можете выполнить SIG_IGN после fork() перед exec(). Это позволяет временно отключить обработчик родителя. Похоже, что будут условия гонки, независимо от того, что вы делаете, но способ fork()/exec() кажется немного более безопасным. Конечно, OP спрашивал о Popen от python, но этот вопрос действительно кажется о Posix; вот почему я здесь. – thejoshwolfe
@thejoshwolfe: Чтобы избежать условий гонки, вы используете sigprocmask(), чтобы отложить сигналы, установить обработчик, вилку, установить обработчик назад, а затем снова использовать sigprocmask для повторного включения сигналов. (И если любые сигналы поступают между вызовами sigprocmask, они будут доставлены в этот момент.) –
- 1. Отправка SIGINT в подпроцесс python
- 2. Как остановить подпроцесс? (Python)
- 3. Как завершить (SIGINT) подпроцесс в Haskell?
- 4. Нагрузочный подпроцесс в Python
- 5. Остановить передачу событий javascript
- 6. Как остановить нежелательную обратную передачу
- 7. Остановить обратную передачу в TextChanged
- 8. Как остановить подпроцесс от завершения моего скрипта?
- 9. Как захватить SIGINT в Python?
- 10. Остановить обратную передачу в javascript
- 11. Как остановить обратную передачу в кнопке изображения
- 12. Отправьте SIGINT на подпроцесс Python, используя os.kill, как будто нажимайте Ctrl + C
- 13. Остановить подпроцесс python, оставляя за собой мертвый процесс «python»
- 14. Подпроцесс Python: как я могу выполнить подпроцесс процесса в python?
- 15. Как остановить python от распространения сигналов на подпроцессы?
- 16. как я могу остановить передачу по ссылке?
- 17. Как захватить SIGINT в Python в Windows?
- 18. Остановить передачу от отправки сообщений
- 19. Подпроцесс Python Блокировка PIPE
- 20. Как остановить обратную передачу при вызове usercontrol
- 21. Получение последней даты фиксации git через передачу команды git на подпроцесс в python
- 22. Python подпроцесс pkill
- 23. Python SIGINT не пойман
- 24. Подпроцесс Python заканчивается на Windows
- 25. Scala: Как предотвратить подпроцессы получать CTRL + C/Ctrl + C/SIGINT
- 26. Как эффективно убить замороженный подпроцесс в Python?
- 27. Подпроцесс Python
- 28. Python: подпроцесс зацикливается
- 29. Завершить подпроцесс в Python
- 30. Используйте подпроцесс в Python
На какой платформе вы работаете? – ChristopheD
Я на Ubuntu linux. – shino