왜 유닉스 프로그램은 의미있는 프로그램 정의 이름 (USR1 등이 아닌)을 가진 신호를 가질 수 없습니까?


79

대부분의 유닉스 프로그램은 신호 좋아 동의 USR1하고 USR2. 예를 들어 Nginx의 실행 파일을 즉시 업그레이드하려면 kill -USR2.

저는 USR1이것이 "사용자 정의"신호라는 것을 이해합니다 . 즉, 프로그램을 만든 사람이 "종료", "로그 덤프"또는 "프를 천 번 인쇄"등의 ​​의미로 사용할 수 있음을 의미합니다. 그러나 나는 그들이이 임의의 이름을 사용해야하는 이유를 이해하지 못한다. 왜 kill -UPGRADE, 나 kill -GRACEFUL_SHUTDOWN? Unix는 특정 신호 만 허용합니까?

그 동안 Nginx는 다음 신호도 사용합니다 ( 문서 참조 ).

  • TERM, INT : 빠른 종료
  • 종료 : 정상 종료
  • HUP :
    • 구성 다시로드
    • 새 구성으로 새 작업자 프로세스 시작
    • 이전 작업자 프로세스를 정상적으로 종료
  • USR1 : 로그 파일 다시 열기
  • USR2 : 즉시 실행 가능한 업그레이드
  • WINCH : 작업자 프로세스를 정상적으로 종료

앉다? 윈치? 이 이름의 이유는 무엇입니까? 이에 대한 자세한 정보는 어디서 얻을 수 있습니까?


1
Apropos of nothing-nginx가 정상적인 종료를 위해 QUIT를 사용한다는 것은 흥미 롭습니다. 전통적으로 TERM + dump-a-core와 유사합니다. TERM은 정상 종료가 가능합니다. 그것은 모두 당신이 신호를 처리하는 방법에 달려 있지만 .. 개발자가 구타당한 길을 벗어난 것은 이상합니다.
synthesizerpatel

1
TIL : man signal신호에 대해 설명하고 31 개를 나열합니다.
Nathan Long

답변:


80

OS에서 사용할 수있는 신호는 OS에 의해 정의됩니다 (일반적으로 POSIX 다음)- "문자열"이 아니라 표준 이름을 가진 정수 상수입니다. USR1그리고 USR2개발자가 원하는 임의의 용도를위한 특별한 의미가없는 두 신호입니다.

Linux 시스템에서 man 7 signal신호 처리 및 신호에 대한 개요를 읽으십시오 .

이벤트에 대한 응답으로 해당 신호를 발행하는 OS를 처리 할 준비가 되었다면 다른 신호의 의미를 재정의 할 수 있습니다. 예를 들어 HUP"구성 다시로드" 를 의미 할 수 있습니다 . 프로세스가 중단 (터미널 손실)되지 않을 것이라고 확신하거나 사용자가 아닌 사용자가 HUP 신호를 보내는 경우를 처리 할 준비가되어있는 한 .


22

HUP"전화 끊기"의 줄임말입니다. 이 신호는 제어 터미널이 파일 끝에 도달하면 프로세스로 전송됩니다. 예전에는 제어 터미널이 일반적으로 전화선을 통한 모뎀 링크를 통해 직렬 포트에 연결되었습니다. 전화 연결이 끊어지면 로컬 모뎀이 Carrier Detect 라인을 낮추어 커널이 EOF를보고하고 SIGHUP신호가 전송되도록합니다.

WINCH"창 변경"의 줄임말입니다. 제어 터미널의 크기가 변경되면 프로세스로 전송됩니다. 명백한 이유로 크기를 변경할 수있는 터미널은 일반적으로 윈도우 환경에서 실행되는 터미널 에뮬레이터 (예 :)로 표현되는 의사 터미널 xterm입니다.


10

시도 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   39) SIGRTMIN+5   40) SIGRTMIN+6   41) SIGRTMIN+7   42) SIGRTMIN+8
43) SIGRTMIN+9   44) SIGRTMIN+10  45) SIGRTMIN+11  46) SIGRTMIN+12  47) SIGRTMIN+13
48) SIGRTMIN+14  49) SIGRTMIN+15  50) SIGRTMAX-14  51) SIGRTMAX-13  52) SIGRTMAX-12
53) SIGRTMAX-11  54) SIGRTMAX-10  55) SIGRTMAX-9   56) SIGRTMAX-8   57) SIGRTMAX-7
58) SIGRTMAX-6   59) SIGRTMAX-5   60) SIGRTMAX-4   61) SIGRTMAX-3   62) SIGRTMAX-2
63) SIGRTMAX-1   64) SIGRTMAX

9

신호 의 이름 이 표준화 되었기 때문 입니다 (POSIX에 의해). -UPGRADE원하는 경우 가져갈 자체 킬 유형 실행 파일을 작성 하고 USR1신호를 전달할 수 있지만 killUNIX와 함께 제공 되는 표준 은이를 인식하지 못합니다.

또는 다음과 같이 별칭, 함수 또는 셸 스크립트를 만들어 번역을 수행 할 수 있습니다 bash.

alias upgrade='kill -USR1'

signal.h헤더 파일은 구현에 의존하고 그 값으로 신호 이름을 매핑합니다.

의 관점 WINCH에서 나는 이것을 약간 가증하다고 생각합니다. 이는 창 크기가 변경 될 때 (특히 제어 터미널의 창이 변경 될 때) 응용 프로그램에 전달되는 신호입니다.

프로세스가 터미널에서 실행되지 않는다는 것을 보장 할 수 없다면이를 사용하여 작업자 스레드를 정상적으로 종료하는 것은 좋은 생각이 아닙니다. 나는 내가 응용 프로그램을 실행하고 있다면 내가 창을 최대화했기 때문에 비행 중 모든 작업을 취소하기로 결정했다면 꽤 실망 할 것임을 알고 있습니다 :-)


1
아-물론 kill그 자체가 -UPGRADE. 나는 그것을 생각하지 않았다. :)
Nathan Long

5

POSIX 호환 플랫폼 SIGUSR1SIGUSR2사용자 정의 된 조건을 지시하는 방법에 보내진 신호이다. 이들에 대한 기호 상수는 헤더 파일에 정의되어 있습니다 signal.h. 신호 번호는 플랫폼마다 다를 수 있으므로 기호 신호 이름이 사용됩니다.

SIG신호 이름의 일반적인 접두사입니다. USR사용자 정의의 약어입니다.


3
이에 대한 한 가지 예는 fsckUSR1에서 진행 정보 인쇄를 시작하고 USR2에서 중지 하는 ext {2,3,4} 변형입니다 . 파일 시스템에 문제가있을 때 매우 편리합니다. 복구 CD에서 부팅하고 fsck를 시작하여 문제를 해결 한 다음 잠시 후 기다리는 지루해지기 시작하면 "젠장, 진행 정보를 활성화하는 몇 가지 옵션을 지정 했어야합니다. ".
hlovdal

5

신호 이름은 Posix보다 이전부터 시작됩니다.

SIG ** IOT **에 대해 이야기하고 싶습니다. DEC PDP 메인 프레임이 사용되었을 때 사용 된 프로세서 에는 시스템 을 부드럽게 충돌시키는 데 자주 사용되는 특수 IOT 명령 (I / O 트랩)이 있었으며 일반적으로 시스템을 강제로 재부팅해야했습니다 (실시간 서버에서). 장치 드라이버 및 권한있는 프로세스 (어셈블러로 작성)와 함께 전체 커널이이 방법을 사용했습니다. 오늘날에도 여전히이 IOT 명령이있는 프로세서가 있습니다.

따라서 커널이 권한이없는 도메인에서 IOT 명령을 실행하면 영향을받는 프로세스에 SIGIOT를 발생시킵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.