왜 유닉스 프로그램은 의미있는 프로그램 정의 이름 (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"구성 다시로드" 를 의미 할 수 있습니다 . 프로세스가 중단 (터미널 손실)되지 않을 것이라는 확신이 있거나 사용자가 아닌 OS가 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신호를 전달할 수 있지만 killUNIX와 함께 제공 되는 표준 은이를 인식하지 못합니다.
또는 다음과 같이 별칭, 함수 또는 셸 스크립트를 만들어 번역을 수행 할 수 있습니다 bash.
alias upgrade='kill -USR1'
signal.h헤더 파일은 구현에 의존하고 그 값으로 신호 이름을 매핑합니다.
의 관점 WINCH에서 나는 이것을 약간 가증하다고 생각합니다. 이것은 창 크기가 변경 될 때 (특히 제어 터미널의 창이 변경 될 때) 응용 프로그램에 전달되는 신호입니다.
프로세스가 터미널에서 실행되지 않는다는 것을 보장 할 수 없다면이를 사용하여 작업자 스레드를 정상적으로 종료하는 것은 좋은 생각이 아닙니다. 나는 내가 응용 프로그램을 실행하고 있다면 내가 창을 최대화했기 때문에 비행 중 모든 작업을 취소하기로 결정했다면 꽤 실망 할 것임을 알고 있습니다 :-)
POSIX 호환 플랫폼 SIGUSR1및 SIGUSR2사용자 정의 된 조건을 지시하는 방법에 보내진 신호이다. 이들에 대한 기호 상수는 헤더 파일에 정의되어 있습니다 signal.h. 신호 번호는 플랫폼마다 다를 수 있으므로 기호 신호 이름이 사용됩니다.
SIG신호 이름의 일반적인 접두사입니다. USR사용자 정의의 약어입니다.
신호 이름은 Posix보다 이전부터 시작되었습니다.
I want to talk about SIG**IOT**. In the times when DEC PDP mainframes were used, the processor(s) used had a special IOT instruction (I/O Trap) which was often used to gently crash the system--usually forcing it to reboot (in realtime servers). The whole kernel along with the device drivers, and privileged processes, (written in assembler), used this method. Even today, there are processors that still have this IOT instruction.
So, when kernel experiences an execution of an IOT instruction in unprivileged domain, it raises a SIGIOT to the affected process.
'Program Club' 카테고리의 다른 글
| 헤더에 #include를 사용해야합니까? (0) | 2020.11.01 |
|---|---|
| MongoDB의 장단점? (0) | 2020.11.01 |
| Visual Studio / TFS에서 소스를 비교할 때 공백을 무시하는 방법은 무엇입니까? (0) | 2020.11.01 |
| SubscribeOn과 ObserveOn의 차이점은 무엇입니까? (0) | 2020.11.01 |
| 표현을 '감시 해제'하는 방법 (0) | 2020.11.01 |