신호 의 기본 개념

4059 단어
신 호 를 이해 하기 위해 가장 익숙 한 장면 부터 말한다.
  • 사용자 가 명령 을 입력 하고 셸 에서 프론트 프로 세 스 를 시작 합 니 다.
  • 사용자 가 Ctrl - C 를 누 르 면 이 키보드 입력 은 하드웨어 가 중단 된다.
  • CPU 가 현재 이 프로 세 스 의 코드 를 실행 하고 있다 면 이 프로 세 스 의 사용자 공간 코드 는 실행 을 중단 하고 CPU 는 사용자 상태 에서 커 널 처리 하드웨어 로 전환 합 니 다.
  • 터미널 드라이버 는 Ctrl - C 를 SIGINT 신호 로 해석 하여 이 프로 세 스 의 PCB 에 기록 합 니 다 (SIGINT 신 호 를 프로 세 스에 보 냈 다 고 할 수 있 습 니 다).
  • 커 널 에서 이 프로 세 스 로 돌아 가 는 사용자 공간 코드 가 계속 실행 되 기 전에 먼저 PCB 에 기 록 된 신 호 를 처리 하고 SIGINT 신호 가 처리 되 어야 하 는 것 을 발 견 했 습 니 다. 이 신호 의 기본 처리 동작 은 프로 세 스 를 종료 하 는 것 이기 때문에 사용자 공간 코드 로 돌아 가지 않 고 프로 세 스 를 직접 종료 합 니 다.

  • Ctrl - C 에서 발생 하 는 신 호 는 프론트 프로 세 스에 만 보 낼 수 있 습 니 다."wait 와 waitpid 함수"에서 우 리 는 하나의 명령 뒤에 & 를 추가 하여 배경 에서 실행 할 수 있 는 것 을 보 았 습 니 다. 그러면 Shell 은 프로 세 스 가 끝 날 때 까지 기다 리 지 않 고 새로운 명령 을 받 아들 여 새로운 프로 세 스 를 시작 할 수 있 습 니 다.Shell 은 프론트 프로 세 스 와 여러 백 엔 드 프로 세 스 를 동시에 실행 할 수 있 으 며, 프론트 프로 세 스 만 이 Ctrl - C 와 같은 제어 키 에서 발생 하 는 신 호 를 받 을 수 있 습 니 다.프론트 프로 세 스 가 실행 되 는 과정 에서 사용 자 는 언제든지 Ctrl - C 를 누 르 면 신 호 를 보 낼 수 있 습 니 다. 즉, 이 프로 세 스 의 사용자 공간 코드 가 어느 곳 에서 든 SIGINT 신 호 를 받 아 종 료 될 수 있 기 때문에 신 호 는 프로 세 스 의 제어 프로 세 스에 비해 비동기 (Asynchronous) 입 니 다.
    kill - l 명령 으로 시스템 정의 신호 목록 을 볼 수 있 습 니 다:
    $ kill -l
     1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
     5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
     9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
    13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
    17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
    21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
    25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
    29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
    ...

    모든 신 호 는 하나의 번호 와 하나의 매크로 정의 이름 이 있 습 니 다. 이 매크로 정 의 는 signal. h 에서 찾 을 수 있 습 니 다. 예 를 들 어 정의\# define SIGINT 2 가 있 습 니 다.번호 34 이상 은 실시 간 신호 로 이 장 에 서 는 번호 34 이하 의 신호 만 논의 하고 실시 간 신 호 는 논의 하지 않 는 다.이 신호 들 은 각각 어떤 조건 에서 발생 하 는 지, 기본 적 인 처리 동작 이 무엇 인지, signal (7) 에서 상세 하 게 설명 되 어 있다.
    Signal     Value     Action   Comment
    -------------------------------------------------------------------------
    SIGHUP        1       Term    Hangup detected on controlling terminal
                                  or death of controlling process
    SIGINT        2       Term    Interrupt from keyboard
    SIGQUIT       3       Core    Quit from keyboard
    SIGILL        4       Core    Illegal Instruction
    ...

    위의 표 에서 첫 번 째 열 은 각 신호 의 매크로 정의 이름 이 고 두 번 째 열 은 각 신호 의 번호 이 며 세 번 째 열 은 기본 처리 동작 입 니 다표 의 마지막 열 은 어떤 조건 에서 이 신 호 를 발생 시 키 는 지 간략하게 소개 하 는 것 이다.
    신호 가 발생 하 는 조건 은 주로 다음 과 같다.
  • 사용자 가 터미널 에서 일부 키 를 눌 렀 을 때 터미널 드라이버 는 프론트 프로 세 스에 신 호 를 보 냅 니 다. 예 를 들 어 Ctrl - C 는 SIGINT 신 호 를 보 내 고 Ctrl -\는 SIGQUIT 신 호 를 보 내 며 Ctrl - Z 는 SIGSTP 신 호 를 보 냅 니 다 (프론트 프로 세 스 를 정지 시 킬 수 있 습 니 다).
  • 하드웨어 이상 에 신호 가 발생 합 니 다. 이러한 조건 은 하드웨어 에서 커 널 을 감지 하고 알려 준 다음 에 커 널 은 현재 프로 세 스에 적당 한 신 호 를 보 냅 니 다.예 를 들 어 현재 프로 세 스 가 0 으로 나 누 는 명령 을 실행 하면 CPU 의 연산 단위 에 이상 이 생 길 수 있 습 니 다. 커 널 은 이 이상 을 SIGFPE 신호 로 프로 세 스에 보 냅 니 다.예 를 들 어 현재 프로 세 스 가 불법 메모리 주 소 를 방문 하면 MMU 에 이상 이 생 길 수 있 습 니 다. 커 널 은 이 이상 을 SIGSEGV 신호 로 프로 세 스에 보 냅 니 다.
  • 한 프로 세 스 가 kill (2) 함 수 를 호출 하면 다른 프로 세 스에 신 호 를 보 낼 수 있 습 니 다.
  • kill (1) 명령 으로 특정한 프로 세 스에 신 호 를 보 낼 수 있 습 니 다. kill (1) 명령 도 kill (2) 함 수 를 호출 하여 이 루어 집 니 다. 신 호 를 명확 하 게 지정 하지 않 으 면 SIGTERM 신 호 를 보 냅 니 다. 이 신호 의 기본 처리 동작 은 프로 세 스 를 종료 하 는 것 입 니 다.
  • 커 널 에서 특정한 소프트웨어 조건 이 발생 했 을 때 도 신호 로 프로 세 스 를 알 릴 수 있다. 예 를 들 어 알 람 이 시간 을 초과 하면 SIGALRM 신호 가 발생 하고 읽 기 단 이 닫 힌 파이프 에 데 이 터 를 쓸 때 SIGIPE 신호 가 발생 한다.

  • 기본 동작 으로 신 호 를 처리 하지 않 으 려 면 사용자 프로그램 은 sigaction (2) 함 수 를 호출 하여 커 널 에 특정한 신 호 를 어떻게 처리 하 는 지 알려 줄 수 있 습 니 다 (sigaction 함수 가 잠시 후에 상세 하 게 소개 합 니 다). 선택 할 수 있 는 처리 동작 은 다음 과 같은 세 가지 가 있 습 니 다.
  • 이 신 호 를 무시 합 니 다.
  • 이 신호 의 기본 처리 동작 을 수행 합 니 다.
  • 신호 처리 함 수 를 제공 합 니 다. 커 널 이 이 신 호 를 처리 할 때 사용자 상태 로 전환 하여 이 처리 함 수 를 실행 하도록 요구 합 니 다. 이런 방식 을 캡 처 (Catch) 신호 라 고 합 니 다.
  • 좋은 웹페이지 즐겨찾기