python 에서 신호 처리 에 대한 상세 한 설명

신호
신호(signal)-프로 세 스 간 통신 의 한 방식 으로 소프트웨어 가 중단 되 는 방법 으로 도 사용 할 수 있 습 니 다.프로 세 스 가 신 호 를 받 으 면 원래 의 프로그램 실행 을 중단 하고 신호 에 따라 처리 합 니 다.
용 어 를 간소화 하고 신 호 는 하나의 사건 으로 운행 기능 의 집행 을 중단 하 는 데 사용 된다.신 호 는 항상 주 Python 스 레 드 에서 실 행 됩 니 다.신호 에 대해 서 는 자세히 소개 하지 않 습 니 다.
Python 은 운영 체제 의 신호 기능 을 가 진 라 이브 러 리 singal 라 이브 러 리 를 봉 합 니 다.singal 라 이브 러 리 는 python 프로그램 에서 신호 체 제 를 실현 할 수 있 습 니 다.
Python 신호 처리
우선 Python 이 왜 signal Library 를 제공 하 는 지 알 아야 합 니 다.신호 라 이브 러 리 는 신호 처리 프로그램 을 사용 하여 도시락 으로 신 호 를 받 을 때 사용자 정의 작업 을 수행 할 수 있 도록 합 니 다.
Mission:신 호 를 받 았 을 때 신호 처리 방법 을 실행 합 니 다.
signal.singal()함 수 를 사용 하여 이 기능 을 실현 할 수 있 습 니 다.
Python 신호 처리
일반적으로 Python 신호 처리 프로그램 은 다른 스 레 드 에서 신 호 를 받 더 라 도 주 Python 주 해상도 기의 주 스 레 드 에서 실 행 됩 니 다.이 는 신호 가 스 레 드 간 통신 수단 으로 사용 되 어 서 는 안 된다 는 뜻 이다.threading 모듈 의 동기 화 원 어 를 바 꿀 수 있 습 니 다.
Python 신호 처리 프로 세 스 는 신호 처리 프로그램(signal handling)에 대한 간략 한 설명 이 필요 합 니 다.signal handling 은 하나의 작업 이나 프로그램 입 니 다.특정한 신 호 를 감지 할 때 처리 함 수 는 두 개의 매개 변수 가 필요 합 니 다.즉,신호 id signal number(Linux 중 1-64)와 스 택 프레임 frame 입 니 다.해당 신 호 를 통 해 대응 하 는 signal handling 을 시작 하고 signal.signal()은 신호 배분 처리 함수 입 니 다.
예 를 들 어 스 크 립 트 를 실행 할 때 취소 합 니 다.이 때 는 신 호 를 캡 처 하고 캡 처 신 호 를 통 해 프로그램 을 비동기 적 으로 우아 하 게 처리 할 수 있 습 니 다.프로그램 에 신호 처리 프로그램 등록 하기:

import signal  
import time 

def handler(a, b):  #     signal handling
    print("Signal Number:", a, " Frame: ", b)  
  
signal.signal(signal.SIGINT, handler)  #  handle       
  
while True:  
    print("Press ctrl + c")
    time.sleep(10)


대응 하 는 신 호 를 캡 처 하지 않 으 면 python 에서 이상 을 던 집 니 다.

root@Seal:/mnt/d/pywork/signal# python signal.py
^CTraceback (most recent call last):
  File "signal.py", line 3, in <module>
    while True:
KeyboardInterrupt


신호 매 거
신호 의 표현 은 int,Python 의 신호 라 이브 러 리 에 대응 하 는 신호 매 거 진 구성원 이 있 습 니 다.
그 중에서 자주 사용 하 는 것 은 보통 있다.
SIGINT control+c
SIGTERM 종료 프로 세 스 소프트웨어 종료 신호
SIGKILL 프로 세 스 종료 프로 세 스 죽 이기
SIGALRM 시간 초과
시그 널
설명 하 다.
SIG_DFL
SIG_IGN
표준 신호 처리 프로그램 은 주어진 신 호 를 간단하게 무시 합 니 다.
SIGABRT SIGIOT
abort 에서 온 중지 신호.
abort 가 이상 프로 세 스 를 종료 시 켰 습 니 다.내부 오 류 를 감지 하거나 제약 을 심각하게 파괴 하 는 라 이브 러 리 함수 로 호출 됩 니 다.예 를 들 어 쌓 인 내부 구조 가 넘 쳐 손상 되면 malloc() 호출 abort()
SIGALRM
SIGVTALRM
SIGPROF
setitimer 와 같은 경보 설정 함수 로 시한 을 설정 하면 도착 시한 에 프로 세 스 는 SIGALRM,SIGVTALRM 또는 SIGPROF 를 받 습 니 다.그러나 이 세 신 호 량 의 의 미 는 각각 다르다.SIGALRM 은 실제 시간 을 계산한다.SIGVTALRM 은 프로 세 스 가 얼마나 많은 CPU 시간 을 사 용 했 는 지,SIGROF 는 프로 세 스 와 이 프로 세 스 를 대표 하 는 커 널 이 얼마나 걸 렸 는 지 를 계산한다.
SIGBUS
버스 에 오류 가 발생 했 을 때 프로 세 스 가 SIGBUS 신 호 를 받 았 습 니 다.예 를 들 어 메모리 접근 이 일치 하거나 존재 하지 않 는 물리 적 주소 가 있 으 면 SIGBUS 신호 가 발생 한다.
SIGCHLD
하위 프로 세 스 가 종료 되 거나 중단 되 거나 중 단 된 후에 복 구 될 때 SIGCHLD 신 호 는 프로 세 스 로 전 송 됩 니 다.이 신호 의 일반적인 용법 은 운영 체제 가 하위 프로 세 스 가 종 료 된 후에 사용 하 는 자원 을 정리 하 는 것 을 지시 하 는 것 이 며,명시 적 으로 호출 되 지 않 고 시스템 호출 을 기다 리 는 것 이다.
SIGILL
불법 명령.프로 세 스 가 불법,형식 오류,알 수 없 거나 특권 명령 을 실행 하려 고 할 때 SIGIL 신 호 는 이 프로 세 스 로 전 송 됩 니 다.
SIGKILL
프로 세 스에 SIGKILL 신 호 를 보 내 면 즉시 종료 할 수 있 습 니 다(KILL).SIGTERM 과 SIGINT 와 달리 이 신 호 는 포착 되 거나 무시 할 수 없 으 며,수신 과정 은 이 신 호 를 받 을 때 어떠한 청소 도 할 수 없다.다음 예외 상황 적용:
SIGINT
키보드 인 터 럽 트(CTRL+C). KeyboardInterrupt
SIGPIPE
프로 세 스 가 다른 프로 세 스에 연결 되 지 않 은 파 이 프 를 쓰 려 고 할 때 SIGPIPE 신 호 는 프로 세 스 로 전 송 됩 니 다.
**SIGTERM **
종결 신호.KILL -15 |KILL
SIGUSR1
SIGUSR2
사용자 정의 신호
SIGWINCH
터미널 창 크기 변경 됨
SIGHUP
제어 단말기 에서 프로 세 스 를 걸 거나 제어 하 는 종료 가 감지 되 었 습 니 다.
Reference:[signal-wikipedia](
신호 함수
Python 의 신호 라 이브 러 리 에 도 자주 사용 되 는 함수 가 많 습 니 다.
signal.alarm(time)
SIGALRM 형식의 신 호 를 만 듭 니 다.time 은 예 정 된 시간 입 니 다.0 으로 설정 하면 이전에 설정 한 타 이 머 를 취소 합 니 다.
signal.pause()
코드 논리 처리 과정 을 잠 들 게 하고 신 호 를 받 을 때 까지 대응 하 는 handler 를 호출 할 수 있 습 니 다.

import signal
import os
import time

def do_exit(sig, stack):
    raise SystemExit('Exiting')

signal.signal(signal.SIGINT, signal.SIG_IGN)
signal.signal(signal.SIGUSR1, do_exit)

print('My PID:', os.getpid())

signal.pause()

실행 중 ctrl+c 신 호 를 무시 하고 USR 1 을 종료 합 니 다.
signal.setitimer(which, seconds, interval)
which: signal.ITIMER_REAL,signal.ITIMER_VIRTUAL 또는 signal.ITIMERPROF
seconds:몇 초 후에 which 를 촉발 합 니까?seconds 를 0 으로 설정 하면 which 의 타 이 머 를 지 울 수 있 습 니 다.
interval:interval 초 간격 으로 한번 촉발
os.getpid()
현재 실행 프로그램의 pid 가 져 오기
윈도 신호 사용
Linux 에 서 는 받 아들 일 수 있 는 모든 신호 매 거 진 값 을 신호 함수 의 매개 변수 로 사용 할 수 있 습 니 다.윈도 우즈 에 서 는 SIGABRT,SIGFPE,SIGINT,SIGIL,SIGSEGV,SIGTERM,SIGBRAK.
signal handling 에 인자 가 필요 하면 어떻게 합 니까?
일부 경우,signal handling 의 작업 은 메 인 프로 세 스에 대응 하여 일부 함 수 를 전달 해 야 하 며,전체 프로젝트 에서 실행 되 는 변수 와 signal handling 은 하나의 역할 영역 에 있 지 않 으 며,signal.signal()은 다른 매개 변 수 를 전달 할 수 없습니다.이 때 partial 을 사용 하여 패 킷 을 만들어 서 이 문 제 를 해결 할 수 있 습 니 다.
예 를 들 면:

import signal
import os
import sys
import time

from functools import partial

"""
  signal frame          
"""
def signal_handler(test_parameter1, test_parameter2, signal_num, frame):
    print "signal {} exit. {} {}".format(signal_num, test_parameter1, test_parameter2)
    sys.exit(1)


a=1
b=2
signal.signal(signal.SIGINT, partial(signal_handler, a, b) )
print('My PID:', os.getpid())

signal.pause()

무시 신호
signal 은 수신 신 호 를 무시 하 는 방법 을 정의 합 니 다.신호 처 리 를 위해 서 는 signal.signal()을 사용 하여 기본 신호 와 signal.SIG 를 사용 해 야 합 니 다.IGN 등록 은 대응 하 는 신호 중단 을 무시 할 수 있 으 며,kill-9 는 무시 할 수 없습니다.

import signal
import os
import time

def receiveSignal(signalNumber, frame):
    print('Received:', signalNumber)
    raise SystemExit('Exiting')
    return

if __name__ == '__main__':
    # register the signal to be caught
    signal.signal(signal.SIGUSR1, receiveSignal)

    # register the signal to be ignored
    signal.signal(signal.SIGINT, signal.SIG_IGN)

    # output current process id
    print('My PID is:', os.getpid())

    signal.pause()

상용 신호

import signal
import os
import time
import sys

def readConfiguration(signalNumber, frame):
    print ('(SIGHUP) reading configuration')
    return

def terminateProcess(signalNumber, frame):
    print ('(SIGTERM) terminating the process')
    sys.exit()

def receiveSignal(signalNumber, frame):
    print('Received:', signalNumber)
    return
 
    signal.signal(signal.SIGHUP, readConfiguration)
    signal.signal(signal.SIGINT, receiveSignal)
    signal.signal(signal.SIGQUIT, receiveSignal)
    signal.signal(signal.SIGILL, receiveSignal)
    signal.signal(signal.SIGTRAP, receiveSignal)
    signal.signal(signal.SIGABRT, receiveSignal)
    signal.signal(signal.SIGBUS, receiveSignal)
    signal.signal(signal.SIGFPE, receiveSignal)
    #signal.signal(signal.SIGKILL, receiveSignal)
    signal.signal(signal.SIGUSR1, receiveSignal)
    signal.signal(signal.SIGSEGV, receiveSignal)
    signal.signal(signal.SIGUSR2, receiveSignal)
    signal.signal(signal.SIGPIPE, receiveSignal)
    signal.signal(signal.SIGALRM, receiveSignal)
    signal.signal(signal.SIGTERM, terminateProcess)
총결산
python 에서 신호 처리 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 python 신호 처리 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기