UNIX 신호 기본 개념

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

  • Ctrl - C 에서 발생 하 는 신 호 는 프론트 프로 세 스에 만 보 낼 수 있 습 니 다.셸 은 프로 세 스 가 끝 날 때 까지 기다 리 지 않 고 새로운 명령 을 받 아들 여 프로 세 스 를 시작 할 수 있 는 명령 뒤에 & 을 추가 하 는 것 을 보 았 습 니 다.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
    
    ...

    .csharpcode, .csharpcode pre
    {
    font-size: small;
    color: black;
    font-family: consolas, "Courier New", courier, monospace;
    background-color: #ffffff;
    /*white-space: pre;*/
    }
    .csharpcode pre { margin: 0em; }
    .csharpcode .rem { color: #008000; }
    .csharpcode .kwrd { color: #0000ff; }
    .csharpcode .str { color: #006080; }
    .csharpcode .op { color: #0000c0; }
    .csharpcode .preproc { color: #cc6633; }
    .csharpcode .asp { background-color: #ffff00; }
    .csharpcode .html { color: #800000; }
    .csharpcode .attr { color: #ff0000; }
    .csharpcode .alt
    {
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
    }
    .csharpcode .lnum { color: #606060; }
    모든 신 호 는 하나의 번호 와 하나의 매크로 정의 이름 이 있 습 니 다. 이 매크로 정 의 는 signal.h 에서 찾 을 수 있 습 니 다. 예 를 들 어 정의 #define SIGINT 2 가 있 습 니 다.
    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
    
    ...

    .csharpcode, .csharpcode pre
    {
    font-size: small;
    color: black;
    font-family: consolas, "Courier New", courier, monospace;
    background-color: #ffffff;
    /*white-space: pre;*/
    }
    .csharpcode pre { margin: 0em; }
    .csharpcode .rem { color: #008000; }
    .csharpcode .kwrd { color: #0000ff; }
    .csharpcode .str { color: #006080; }
    .csharpcode .op { color: #0000c0; }
    .csharpcode .preproc { color: #cc6633; }
    .csharpcode .asp { background-color: #ffff00; }
    .csharpcode .html { color: #800000; }
    .csharpcode .attr { color: #ff0000; }
    .csharpcode .alt
    {
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
    }
    .csharpcode .lnum { color: #606060; }
    위의 표 에서 첫 번 째 열 은 각 신호 의 매크로 정의 이름 이 고 두 번 째 열 은 각 신호 의 번호 입 니 다. 세 번 째 열 은 기본 처리 동작 입 니 다. Term 현재 프로 세 스 를 종료 하 는 것 을 표시 합 니 다. Core 현재 프로 세 스 를 종료 하 는 것 을 표시 하고 코어 덤 프 (다음 절 은 코어 덤 프 가 무엇 인지 상세 하 게 소개 합 니 다) Ign 는 이 신 호 를 무시 합 니 다. Stop 현재 프로 세 스 를 중단 하 는 것 을 표시 합 니 다. Cont이전에 정 지 된 프로 세 스 를 계속 실행 하 는 것 을 표시 합 니 다. 표 의 마지막 열 은 어떤 조건 에서 이 신 호 를 발생 시 키 는 지 설명 하 는 것 입 니 다.
    신호 가 발생 하 는 조건 은 주로 다음 과 같다.
  • 사용자 가 터미널 에서 일부 키 를 눌 렀 을 때 터미널 드라이버 는 프론트 프로 세 스에 신 호 를 보 냅 니 다. 예 를 들 어 Ctrl - C 는 SIGINT 신 호 를 보 내 고 Ctrl -\는 SIGQUIT 신 호 를 보 내 며 Ctrl - Z 는 SIGTSTP 신 호 를 보 냅 니 다.
  • 하드웨어 이상 에 신호 가 발생 합 니 다. 이러한 조건 은 하드웨어 에서 커 널 을 감지 하고 알려 준 다음 에 커 널 은 현재 프로 세 스에 적당 한 신 호 를 보 냅 니 다.예 를 들 어 현재 프로 세 스 가 0 을 나 누 는 명령 을 실행 하면 CPU 의 연산 단위 에 이상 이 생 길 수 있 습 니 다. 커 널 은 이 이상 을 SIGFPE 신호 로 프로 세 스에 보 냅 니 다.예 를 들 어 현재 프로 세 스 가 불법 메모리 주 소 를 방문 하면 MMU 에 이상 이 생 길 수 있 습 니 다. 커 널 은 이 이상 을 SIGSEGV 신호 로 프로 세 스에 보 냅 니 다.
  • 하나의 프로 세 스 호출 kill(2) 함수 가 다른 프로 세 스에 신 호 를 보 낼 수 있 습 니 다.
  • 명령 으로 특정한 프로 세 스에 신 호 를 보 낼 수 있 습 니 다. kill(1) 명령 도 호출 kill(1) 함수 로 이 루어 집 니 다. 신 호 를 명확 하 게 지정 하지 않 으 면 kill(2) 신 호 를 보 냅 니 다. 이 신호 의 기본 처리 동작 은 프로 세 스 를 종료 하 는 것 입 니 다.
  • 커 널 이 특정한 소프트웨어 조건 이 발생 했 을 때 도 신호 로 프로 세 스 를 알 릴 수 있다. 예 를 들 어 알 람 시간 초과 SIGTERM 신호 가 발생 하고 읽 기 단 이 닫 힌 파이프 에 데 이 터 를 쓸 때 SIGALRM 신호 가 발생 한다.

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