다양한 신호가 전송되는 원인은 무엇입니까?


28

때때로 프로세스가 수신 할 수있는 모든 신호에 약간 혼란스러워집니다. 내가 이해하는 것처럼 프로세스에는 이러한 각 신호에 대한 기본 처리기 ( 신호 처리 )가 있지만를 호출하여 자체 처리기를 제공 할 수 있습니다 sigaction().

여기 내 질문이 있습니다 : 각 신호가 전송되는 원인은 무엇입니까? -s매개 변수를 통해 실행중인 프로세스에 수동으로 신호를 보낼 수 있다는 것을 알고 kill있지만 이러한 신호가 전송되는 자연 환경 은 무엇 입니까? 예를 들어, 언제 SIGINT전송됩니까?

또한 신호를 처리 할 수있는 제한 사항이 있습니까? 심지어 수 SIGSEGV신호 처리 및 제어를 애플리케이션으로 리턴한다?


이것에 대한 정답은 서사시가 될 것이며, 기본적으로 Wikipedia 기사 의 정보 를 그 문제에 대해 복제하는 것입니다.
Shawn J. Goff

@Shawn : Wikipedia 기사에는 신호 목록이 있지만 누가 어떤 신호를 보내는 지 명확하게 제시하지는 않습니다.
Gilles 'SO- 악마 그만해'

답변:


41

프로세스를 호출하는 것 외에도 다양한 상황에서 kill(2)일부 신호 는 커널 (또는 때때로 프로세스 자체)에 의해 전송됩니다.

  • 터미널 드라이버는 다양한 이벤트에 해당하는 신호를 보냅니다.
    • 키 누름 알림 : SIGINT(주 루프로 돌아가십시오) on Ctrl+ C, SIGQUIT(즉시 종료하십시오) on Ctrl+ \, SIGTSTP(일시 중지하십시오) on Ctrl+ Z. stty명령으로 키를 변경할 수 있습니다 .
    • SIGTTINSIGTTOU백그라운드 프로세스가 판독 또는 제어 단자에 쓰려고 할 때 전송된다.
    • SIGWINCH 터미널 창의 크기가 변경되었다는 신호로 전송됩니다.
    • SIGHUP터미널이 사라진 것을 신호로 전송한다 (모뎀이 있었기 때문에 역사적 시간위로 , 현재 일반적으로는 터미널 에뮬레이터 창을 닫은 때문이다).
  • 일부 프로세서 트랩은 신호를 생성 할 수 있습니다. 세부 사항은 아키텍처와 시스템에 따라 다릅니다. 다음은 일반적인 예입니다.
    • SIGBUS 정렬되지 않은 액세스 메모리;
    • SIGSEGV 매핑되지 않은 페이지에 액세스
    • SIGILL 잘못된 명령 (잘못된 opcode)
    • SIGFPE인수가 잘못된 부동 소수점 명령어 (예 :) sqrt(-1).
  • 많은 시스템 신호가 대상 시스템에 일부 시스템 이벤트가 발생했음을 알려줍니다.
    • SIGALRM프로세스에서 설정 한 타이머가 만료되었음을 알립니다. 타이머는 설정할 수 있습니다 alarm, setitimer등.
    • SIGCHLD 자녀 중 하나가 사망 한 과정을 알립니다.
    • SIGPIPE읽기 끝이 폐쇄 된 경우 프로세스 시도가 파이프에 기록 할 때 생성되는 (생각은 당신이 실행하는 경우 것입니다 foo | barbar종료, fooa로 살해됩니다 SIGPIPE).
    • SIGPOLL(라고도 함 SIGIO)는 폴 러블 이벤트가 발생했음을 프로세스에 알립니다. POSIX는를 통해 등록 된 폴링 가능한 이벤트를 지정합니다 I_SETSIG ioctl. 많은 시스템은 O_ASYNC fcntl플래그 를 통해 설정된 모든 파일 디스크립터에서 폴링 가능한 이벤트를 허용합니다 . 관련 신호는 SIGURG장치 (긴급 등록 I_SETSIG ioctl) 또는 소켓 의 긴급 데이터를 알려줍니다 .
    • 일부 시스템에서는 UPS에 정전이 임박했음을 알리면 SIGPWR모든 프로세스로 전송됩니다 .

이 목록은 완전한 것이 아닙니다. 표준 신호는에 정의되어 signal.h있습니다.

대부분의 신호는 응용 프로그램에서 포착 및 처리 (또는 무시) 할 수 있습니다. 잡을 수없는 두 가지 휴대용 신호는 SIGKILL(그냥 죽는다) 및 STOP(실행 중지)입니다.

SIGSEGV( 세그먼트 오류 )와 그 사촌 SIGBUS( 버스 오류 )이 잡힐 수 있지만, 실제로 무엇을하고 있는지 알지 못한다면 나쁜 생각입니다. 이를 잡기위한 일반적인 응용 프로그램은 스택 추적 또는 기타 디버그 정보를 인쇄하는 것입니다. 고급 응용 프로그램은 일종의 인 프로세스 메모리 관리를 구현하거나 가상 시스템 엔진의 잘못된 명령을 트랩하는 것입니다.

마지막으로 신호가 아닌 것을 언급하겠습니다. 터미널에서 입력을 읽는 프로그램의 행 시작 부분에서 Ctrl+ 를 누르면 D입력 파일의 끝에 도달했음을 프로그램에 알립니다. 이것은 신호가 아닙니다 : 입력 / 출력 API를 통해 전송됩니다. Ctrl+ C및 친구 와 마찬가지로 키를로 구성 할 수 있습니다 stty.


그리고 SIGHUP, 모뎀이 끊어졌습니다. :-)
Keith

1
주목해야 할 또 다른 사항 : SIGFPE직관적이지 않은 방식으로 0으로 나누는 정수 , 때로는 부호있는 정수 오버플로로 표시됩니다.
ephemient

18

: 첫 번째 질문에 대답 SIGSTOP하고 SIGKILL심지어 응용 프로그램,하지만 다른 모든 신호 캔에 의해 체포 될 수 없다 SIGSEGV. 이 속성은 디버깅에 유용합니다. 예를 들어 올바른 라이브러리 지원을 SIGSEGV통해 스택 백 트레이스를 수신 하고 생성하여 해당 segfault가 발생한 위치를 표시 할 수 있습니다.

각 신호의 기능에 대한 공식 단어 (Linux의 경우) man 7 signal는 Linux 명령 행에서 입력하여 사용할 수 있습니다 . http://linux.die.net/man/7/signal 은 동일한 정보를 가지고 있지만 테이블을 읽기가 더 어렵습니다.

그러나 신호에 대한 경험이 없으면 간단한 설명에서 실제로 수행하는 작업을 알기가 어렵 기 때문에 여기에 내 해석이 있습니다.

키보드에서 트리거

  • SIGINT때 때 발생합니다 CTRL+C.
  • SIGQUIT에 의해 트리거되고 CTRL+\코어를 덤프합니다.
  • SIGTSTP때 때 프로그램을 일시 중단합니다 CTRL+Z. 와 달리 SIGSTOP, 잡을 수있어 프로그램 vi을 중지하기 전에 터미널을 안전한 상태로 재설정 할 수있는 기회를 제공합니다 .

터미널 상호 작용

  • SIGHUP ( "hangup")은 프로그램이 실행되는 동안 xterm을 닫거나 터미널 연결을 끊을 때 발생합니다.
  • SIGTTIN그리고 SIGTTOU그것은 백그라운드에서 실행중인 동안이나 쓰기 터미널에 읽으려고하면 프로그램을 일시 중지합니다. 이를 SIGTTOU위해서는 /dev/tty기본 stdout뿐만 아니라에 프로그램을 작성해야한다고 생각합니다 .

CPU 예외에 의해 트리거

이것은 당신의 프로그램이 잘못된 것을 시도했다는 것을 의미합니다.

  • SIGILL불법적이거나 알려지지 않은 프로세서 명령을 의미합니다. 예를 들어, 프로세서 I / O 포트에 직접 액세스하려는 경우에 발생할 수 있습니다.
  • SIGFPE하드웨어 수학 오류가 있음을 의미합니다. 아마도 프로그램은 0으로 나누려고 시도했을 것입니다.
  • SIGSEGV 프로그램이 매핑되지 않은 메모리 영역에 액세스하려고 시도했음을 의미합니다.
  • SIGBUS프로그램이 다른 방식으로 메모리에 잘못 액세스했음을 의미합니다. 이 요약에 대해서는 자세히 다루지 않겠습니다.

프로세스 상호 작용

  • SIGPIPE파이프 판독기가 끝을 닫은 후 파이프에 쓰려고하면 발생합니다. 참조하십시오 man 7 pipe.
  • SIGCHLD생성 한 하위 프로세스가 종료되거나 일시 중단 SIGSTOP되거나 이와 유사한 경우에 발생합니다.

자체 신호에 유용

  • SIGABRT일반적으로 프로그램이 abort()함수를 호출하여 발생하며 기본적으로 코어 덤프가 발생합니다. "공황 버튼"의 일종.
  • SIGALRMalarm()시스템 호출 로 인해 발생하며 , 이로 인해 커널 SIGALRM은 지정된 시간 (초) 후에 프로그램에 a 를 전달합니다 . 참조 man 2 alarmman 2 sleep.
  • SIGUSR1그리고 SIGUSR2그러나 프로그램 좋아하는 데 사용됩니다. 프로세스 간 신호에 유용 할 수 있습니다.

관리자가 보냄

이들 신호는 일반적으로 통해 명령 프롬프트로부터 전송되는 kill명령이나 fg또는 bg의 경우 SIGCONT.

  • SIGKILLSIGSTOPunblockable 신호이다. 첫 번째는 항상 프로세스를 즉시 종료합니다. 두 번째는 프로세스를 일시 중단합니다.
  • SIGCONT 일시 중단 된 프로세스를 재개합니다.
  • SIGTERM의 주목할만한 버전입니다 SIGKILL.

shutdown명령을 사용할 때 어떤 신호가 전송 됩니까?
Nathan Osman

종료 스크립트에 따라 다릅니다. 일반적으로 SIGTERM먼 저 먼저 전송 된 다음 지연이 전송됩니다 SIGKILL. 원칙적으로, 즉각적인 강제 종료를 위해 커널은 신호를 전혀 보낼 필요가 없습니다. 프로세스 실행을 중지 할 수 있습니다.
Jander
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.