신호 처리기에 대해 배우고 있습니다. 나는 수신하는 모든 신호를 처리하고 인쇄하기 위해 간단한 Python 스크립트를 작성했습니다. 그런 다음 원격 시스템에서 스크립트를 실행합니다 ssh
. 그런 다음 Ctrl C 신호를 보내면 원격 프로세스가 예상대로 중단됩니다. 대신 Ctrl Z 신호를 보내면 원격 프로세스가 예상대로 중지되지 않습니다.
첫째, Ctrl Z가 원격 스크립트에 도달하지 못할 수도 있다고 생각했습니다. 그러나 사용자 정의 핸들러를 연결하면 Ctrl Z가 전송되는 것을 감지합니다.
그런 다음 Ctrl Z가 프로세스에서 무시되었을 수도 있다고 생각했습니다. 그러나 SIGTSTP에 대한 현재 핸들러를 인쇄하면 SIG_IGN을 얻을 것으로 예상됩니다. 그러나 이는 SIG_DFL입니다(SIGTSTP의 경우 프로세스 중지를 의미함).
누구든지 이 동작을 설명할 수 있나요?
SSH 명령을 실행합니다:
ssh ubuntu16x64-1 -t 'python3 ~/sig_check.py'
서명 확인 Python 스크립트:
#! /usr/bin/python3
import signal, errno
import time, os, sys
all_sigs = list(signal.Signals)
open('sig_log.txt', 'w').close()
def print_sig(num, frame):
with open('sig_log.txt', 'a') as f:
f.write('{}\n'.format(num))
print(num)
for sig in all_sigs:
if sig == 20: # SIGTSTP
print(sig, signal.getsignal(sig))
continue # commenting this would set handler for Ctrl Z
try:
signal.signal(sig, print_sig)
except OSError:
print('OSerr: Skipping %s' % (sig))
except ValueError:
print('Valerr: Skipping %s' % (sig))
print("Process pid %d" % (os.getpid()))
print("Parent pid %d" % (os.getppid()))
while True:
time.sleep(2)
pass
편집하다:마지막 문단에 묻어남이것페이지에서 이런 일이 발생할 수 있는 상황을 발견했습니다. 즉, SIGTSTP를 수신하는 프로세스가 고아 프로세스 그룹에 있는 경우입니다. 하지만 이번 사건이 그런 범주에 속하는지는 잘 모르겠습니다.