`kill -l`이 32와 33의 신호 번호를 나열하지 않는 이유는 무엇입니까?


18

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

무슨 일이 일어난 3233? 목록에없는 이유는 무엇입니까? 그들은 중간에 2를 건너 뛰는 대신 1에서 시작하여 62에서 끝날 수 있었습니까?


PS "오류 코드"는 없습니다. 신호 번호입니다.
G-Man, 'Reinstate

답변:


20

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가 증가하므로 처음 두 실시간 신호는 실시간 신호 범위에서 제외됩니다.


그래서 어떻게 하나 않습니다 얻을 코드를 실행 한 조각에 실행시 SIGRTMIN의 현재 값을?
SlySven

10

신호는 다음과 같습니다.

SIGWAITING 32 Ignore All LWPs blocked 
    SIGLWP 33 Ignore Virtual Interprocessor Interrupt for Threads Library 

둘 다 Linux에서 지원되지 않습니다. (LWP는 LightWeight Process의 약자 )

소스 : IBM DeveloperWorks Solaris에서 Linux 로의 포팅 안내서


Linux에는 신호 32와 33이 있습니다. unixhelp.ed.ac.uk/CGI/man-cgi?signal+7 , Real-time Signals섹션을 참조하십시오 .
cuonglm

@Gnouc-에 따르면 kill -l RTMIN32에서 시작하여 34에서 시작하여 문서를 참조하지 않았습니다. 이것은 33에서 시작한다고 말하지만 glibc 스레딩 구현에 따라 숫자가 다를 수 있으므로 숫자로 참조하면 안된다고 말합니다.
garethTheRed

물론 시스템에 따라 다르지만 Linux가 지원하지 않는 용어는 올바르지 않습니다. 이것을 참조하십시오 : cse.psu.edu/~dheller/cmpsc311/Lectures/Process-Control-Signals/… . 어쩌면 우리는 신호 32, 33으로 어떤 일이 발생했는지 알려주기 위해 오래 전에 리눅스를 사용해 본 베테랑이 필요할 것입니다. 왜 문서화되지 않았습니까?
cuonglm

그것들은 RT pthread 라이브러리에 의해 내부적으로 사용되며 과거에는 다른 시스템이 내부 목적을 위해 많은 시스템을 사용했기 때문에 3 개가 2 개가 없었습니다. 코딩 관점에서 SIGSYS 위의 신호에 대해 컴파일 타임 상수를 사용해서는 안됩니다. 예를 들어 SIGRTMIN, #define라인이 있는 세트 는 실행 파일이 실행될 때 나중에 변경 될 수 있기 때문에 해당 숫자는 변경 될 수 있습니다. 한 pthread 라이브러리에 대해 컴파일 된 응용 프로그램이 다른 pthread 라이브러리와 함께 재부팅 된 시스템에서 실행 된 경우 몇 년 전에 두 pthread 라이브러리가 모두 사용되었을 때 나타났습니다!
SlySven
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.