Python 스크립트는 조기 종료를 막기 위해
프로세스 프로세스
모듈로 SIGINT 신호를 차단하지만이 신호는 Popen으로 여는 하위 프로세스로 전달됩니다. 사용자가 ctrl-c를 눌렀을 때 조기에 종료되지 않도록이 신호를 하위 프로세스로 전달하는 것을 방지 할 수있는 방법이 있습니까?SIGINT가 파이썬에서 서브 프로세스로 전달되는 것을 멈추는 방법은 무엇입니까?
답변
tty
모듈을 사용하여 ctrl-c의 역할을 다시 지정할 수 있습니다.이 모듈을 사용하면 신호 할당을 조작 할 수 있습니다. 그러나 프로그램을 수정하기 전의 상태로 되돌려 놓지 않으면 프로그램이 종료 된 후에도 쉘의 전체 세션을 지속하게됩니다.
다음은 이전 tty 설정을 저장하고 ctrl-c에 ctrl-c를 다시 할당 한 다음 종료시 이전 tty 설정을 복원하는 간단한 코드 스 니펫입니다. 당신이 하위 프로세스를 시작할 때 SIGINT (signal.signal(signal.SIGINT, signal.SIG_IGN)
를) 무시하는 신호 모듈을 사용 그래서 만약
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를 무시하는 것보다 처리를 사용자 정의해야하는 경우, 하위 프로세스를 생성하는 동안 SIGINT를 일시적으로 무시한 다음 사용자 정의 신호 처리기를 (다시) 설정해야합니다.
SIGINT를 잡으려고하고 깃발을 설정하여 즉시 안전 포인트를 종료 할 수 있도록하려면 안전 포인트에 도달하면 코드가 수동으로 자손을 정리해야한다는 것을 기억하십시오. 자식 프로세스와 시작하는 프로세스는 SIGINT를 무시합니다.
이것이 작동하는 경우 (항상 그렇지는 않음) 터미널을 사용하는 것보다 더 나은 옵션입니다. – zwol
popen() 대신 fork()/exec()를 사용하면 exec() 전에 fork() 후에 SIG_IGN을 수행 할 수 있습니다. 이렇게하면 부모에서 처리기를 일시적으로 사용하지 않도록 할 수 있습니다. 당신이 무엇을 하든지 경쟁 조건이 될 것 같지만 fork()/exec() 방법은 조금 더 안전 해 보입니다. 물론, OP는 파이썬의 Popen에 대해 묻고 있었지만,이 질문은 Posix에 관한 것 같습니다. 그래서 내가 여기 왔어. – thejoshwolfe
@thejoshwolfe : 경쟁 조건을 피하기 위해 sigprocmask()를 사용하여 신호를 지연시키고 핸들러를 설정하고 포크를 설정 한 다음 핸들러를 다시 설정 한 다음 sigprocmask를 다시 사용하여 신호를 다시 활성화합니다. (그리고 sigprocmask에 대한 호출 사이에 어떤 신호가 도착하면, 그들은이 시점에서 전달 될 것입니다.) –
- 1. 파이썬에서 서브 프로세스로 파일에 출력하기
- 2. omniauth client_options가 facebook으로 전달되는 것을 멈추는 방법?
- 3. nano를 파이썬에서 서브 프로세스로 시작하여 입력을 캡처하십시오.
- 4. html로 성장하는 것을 멈추는 방법은 무엇입니까?
- 5. waitpid()는 SIGINT가 자식 프로세스로 보내지도록 허용하지 않습니까?
- 6. SIGINT를 파이썬의 서브 프로세스로 보내기
- 7. 서브 클래스가 파이썬에서 메소드를 구현해야한다는 것을 알리는 예외는
- 8. TestDriven.NET을 사용하여 .NET 소스 코드로 스텝핑하는 것을 멈추는 방법은 무엇입니까?
- 9. gnuplot이 활성 창의 포커스를 잡는 것을 멈추는 방법은 무엇입니까? (Windows)
- 10. Eclipse에서 디버깅이 멈추는 것을 막으십시오.
- 11. sed를 버퍼링하는 것을 멈추는 방법?
- 12. 파이썬에서 서브 클래 싱하기
- 13. sinatra 실행을 멈추는 방법은 무엇입니까?
- 14. SIGTSTP 신호를 하위 프로세스로 제어하는 방법은 무엇입니까?
- 15. UI가 멈추는 것을 어떻게 막을 수 있습니까?
- 16. xml 네임 스페이스가 자식에게 전달되는 것을 방지합니다.
- 17. Androids 'Browser가 뒤로 스크롤하는 것을 멈추는 방법
- 18. OpenLayers가 firebug lite를 로딩하는 것을 멈추는 방법
- 19. JQWicket의 AjaxSlider가 오른쪽으로 이동하는 것을 멈추는 방법?
- 20. 병렬 프로세스로 시뮬레이션을 문서화하는 방법은 무엇입니까?
- 21. 파이썬에서 서브 프로세스로부터 환경을 얻는 방법
- 22. 파이썬에서 십진수를 서브 클래 싱하기
- 23. 파이썬에서 서브 트리를 제거하는 법
- 24. iphone에서 'Accept-Language'헤더가 http로 전달되는 방법은 무엇입니까?
- 25. 참조로 전달되는 언어는 무엇입니까?
- 26. 전달되는 항목은 무엇입니까? 코드에서
- 27. 파이썬을 별도의 프로세스로 실행하십시오.
- 28. "svn commit"이 시작되기 전에 멈추는 것을 어떻게 진단합니까?
- 29. UIScrollView에서 손가락을 떼면 스크롤을 멈추는 방법은 무엇입니까?
- 30. beginAnimations 사용 후 애니메이션을 멈추는 방법은 무엇입니까?
어떤 플랫폼을 사용하고 계십니까? – ChristopheD
나는 우분투 리눅스에있어. – shino