[unix] 왜 유닉스 프로그램은 의미있는 프로그램 정의 이름 (USR1 등이 아닌)을 가진 신호를 가질 수 없습니까?
대부분의 유닉스 프로그램은 신호 좋아 동의 USR1
하고 USR2
. 예를 들어 Nginx의 실행 파일을 즉시 업그레이드하려면 kill -USR2
.
저는 USR1
이것이 “사용자 정의”신호라는 것을 이해합니다 . 즉, 프로그램을 만든 사람이 “종료”, “로그 덤프”또는 “프를 천 번 인쇄”등의 의미로 사용할 수 있음을 의미합니다. 그러나 나는 그들이이 임의의 이름을 사용해야하는 이유를 이해하지 못한다. 왜 kill -UPGRADE
, 나 kill -GRACEFUL_SHUTDOWN
? Unix는 특정 신호 만 허용합니까?
그 동안 Nginx는 다음 신호도 사용합니다 ( 문서 참조 ).
- TERM, INT : 빠른 종료
- 종료 : 정상 종료
- HUP :
- 구성 다시로드
- 새 구성으로 새 작업자 프로세스 시작
- 이전 작업자 프로세스를 정상적으로 종료
- USR1 : 로그 파일 다시 열기
- USR2 : 즉시 실행 가능한 업그레이드
- WINCH : 작업자 프로세스를 정상적으로 종료
앉다? 윈치? 이 이름의 이유는 무엇입니까? 이에 대한 자세한 정보는 어디서 얻을 수 있습니까?
답변
OS에서 사용할 수있는 신호는 OS에 의해 정의됩니다 (일반적으로 POSIX 다음)- “문자열”이 아니라 표준 이름을 가진 정수 상수입니다. USR1
그리고 USR2
개발자가 원하는 임의의 용도를위한 특별한 의미가없는 두 신호입니다.
Linux 시스템에서 man 7 signal
신호 처리 및 신호에 대한 개요를 읽으십시오 .
이벤트에 대한 응답으로 해당 신호를 발행하는 OS를 처리 할 준비가 되었다면 다른 신호의 의미를 재정의 할 수 있습니다. 예를 들어 HUP
“구성 다시로드” 를 의미 할 수 있습니다 . 프로세스가 중단 (터미널 손실)되지 않을 것이라고 확신하거나 사용자가 아닌 사용자가 HUP 신호를 보내는 경우를 처리 할 준비가되어있는 한 .
답변
HUP
“전화 끊기”의 줄임말입니다. 이 신호는 제어 터미널이 파일 끝에 도달하면 프로세스로 전송됩니다. 예전에는 제어 터미널이 일반적으로 전화선을 통한 모뎀 링크를 통해 직렬 포트에 연결되었습니다. 전화 연결이 끊어지면 로컬 모뎀이 Carrier Detect 라인을 낮추어 커널이 EOF를보고하고 SIGHUP
신호가 전송되도록합니다.
WINCH
“창 변경”의 줄임말입니다. 제어 터미널의 크기가 변경되면 프로세스로 전송됩니다. 명백한 이유로 크기를 변경할 수있는 터미널은 일반적으로 윈도우 환경에서 실행되는 터미널 에뮬레이터 (예 :)로 표현되는 의사 터미널 xterm
입니다.
답변
시도 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
답변
신호 의 이름 이 표준화 되었기 때문 입니다 (POSIX에 의해). -UPGRADE
원하는 경우 가져갈 자체 킬 유형 실행 파일을 작성 하고 USR1
신호를 전달할 수 있지만 kill
UNIX와 함께 제공 되는 표준 은이를 인식하지 못합니다.
또는 다음과 같이 별칭, 함수 또는 셸 스크립트를 만들어 번역을 수행 할 수 있습니다 bash
.
alias upgrade='kill -USR1'
signal.h
헤더 파일은 구현에 의존하고 그 값으로 신호 이름을 매핑합니다.
의 관점 WINCH
에서 나는 이것을 약간 가증하다고 생각합니다. 이는 창 크기가 변경 될 때 (특히 제어 터미널의 창이 변경 될 때) 응용 프로그램에 전달되는 신호입니다.
프로세스가 터미널에서 실행되지 않는다는 것을 보장 할 수 없다면이를 사용하여 작업자 스레드를 정상적으로 종료하는 것은 좋은 생각이 아닙니다. 나는 내가 응용 프로그램을 실행하고 있다면 내가 창을 최대화했기 때문에 비행 중 모든 작업을 취소하기로 결정했다면 꽤 실망 할 것임을 알고 있습니다 🙂
답변
POSIX 호환 플랫폼 SIGUSR1
및 SIGUSR2
사용자 정의 된 조건을 지시하는 방법에 보내진 신호이다. 이들에 대한 기호 상수는 헤더 파일에 정의되어 있습니다 signal.h
. 신호 번호는 플랫폼마다 다를 수 있으므로 기호 신호 이름이 사용됩니다.
SIG
신호 이름의 일반적인 접두사입니다. USR
사용자 정의의 약어입니다.
답변
신호 이름은 Posix보다 이전부터 시작됩니다.
SIG ** IOT **에 대해 이야기하고 싶습니다. DEC PDP 메인 프레임이 사용되었을 때 사용 된 프로세서 에는 시스템 을 부드럽게 충돌시키는 데 자주 사용되는 특수 IOT 명령 (I / O 트랩)이 있었으며 일반적으로 시스템을 강제로 재부팅해야했습니다 (실시간 서버에서). 장치 드라이버 및 권한있는 프로세스 (어셈블러로 작성)와 함께 전체 커널이이 방법을 사용했습니다. 오늘날에도 여전히이 IOT 명령이있는 프로세서가 있습니다.
따라서 커널이 권한이없는 도메인에서 IOT 명령을 실행하면 영향을받는 프로세스에 SIGIOT를 발생시킵니다.