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
무슨 일이 일어난 32
및 33
? 목록에없는 이유는 무엇입니까? 그들은 중간에 2를 건너 뛰는 대신 1에서 시작하여 62에서 끝날 수 있었습니까?
답변
NPTL 때문입니다 . GNU C 라이브러리의 일부이기 때문에 거의 모든 최신 Linux 배포판은 더 이상 처음 두 실시간 신호를 사용하지 않습니다. NPTL은 POSIX Threads 의 구현입니다 . NPTL은 처음 두 실시간 신호를 내부적으로 사용합니다.
신호 맨 페이지 의이 부분 은 매우 흥미 롭습니다.
Linux 커널은 33에서 64까지 다양한 32 개의 실시간 신호를 지원합니다. 그러나 glibc POSIX 스레드 구현은 내부적으로 2 개의 (NPTL의 경우) 또는 3 개의 (LinuxThreads의) 실시간 신호를 사용합니다 (pthreads (7) 참조). SIGRTMIN의 값을 적절하게 (34 또는 35로) 조정합니다. 사용 가능한 실시간 신호의 범위는 glibc 스레딩 구현에 따라 다르며 (이 변형은 사용 가능한 커널 및 glibc에 따라 런타임에 발생할 수 있음) 실제로 실시간 신호의 범위는 UNIX 시스템에 따라 다릅니다. 하드 코딩 된 숫자를 사용하여 실시간 신호를 참조하지 말고 대신 SIGRTMIN + n 표기법을 사용하여 실시간 신호를 참조해야하며 SIGRTMIN + n이 SIGRTMAX를 초과하지 않는 적절한 (런타임) 검사를 포함해야합니다.
또한 glibc의 소스 코드를 확인했습니다. 22 행을 참조하십시오 . __SIGRTMIN
+2가 증가하므로 처음 두 실시간 신호는 실시간 신호 범위에서 제외됩니다.
답변
신호는 다음과 같습니다.
SIGWAITING 32 Ignore All LWPs blocked
SIGLWP 33 Ignore Virtual Interprocessor Interrupt for Threads Library
둘 다 Linux에서 지원되지 않습니다. (LWP는 LightWeight Process의 약자 )