Por que o `kill -l` não lista os números de sinal de 32 e 33?

18

A execução kill -lno linux fornece:

 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

O que aconteceu com 32e 33? Por que não está listado? Eles poderiam ter começado em 1 e terminado em 62 em vez de pular 2 no meio?

user2555595
fonte
PS Não existem "códigos de erro" - são números de sinal.
G-Man diz 'Reinstate Monica'

Respostas:

20

É por causa do NPTL . Como faz parte da biblioteca GNU C, quase todas as distribuições Linux modernas não usam mais os dois primeiros sinais em tempo real. NPTL é uma implementação dos threads POSIX . O NPTL faz uso interno dos dois primeiros sinais em tempo real.

Esta parte da página de manual do sinal é muito interessante:

O kernel do Linux suporta um intervalo de 32 sinais diferentes em tempo real, numerados de 33 a 64. No entanto, a implementação de threads glibc POSIX usa internamente dois sinais em tempo real (para NPTL) ou três (para LinuxThreads) (consulte pthreads (7)) e ajusta o valor de SIGRTMIN adequadamente (para 34 ou 35). Como o intervalo de sinais disponíveis em tempo real varia de acordo com a implementação do glibc threading (e essa variação pode ocorrer em tempo de execução de acordo com o kernel e o glibc disponíveis), e de fato o intervalo de sinais em tempo real varia entre os sistemas UNIX, os programas devem nunca se refira a sinais em tempo real usando números codificados, mas deve sempre se referir a sinais em tempo real usando a notação SIGRTMIN + n, e inclua verificações adequadas (em tempo de execução) para que SIGRTMIN + n não exceda SIGRTMAX.

Eu também verifiquei o código fonte para glibc; veja a linha 22 . __SIGRTMINé aumentado em +2; portanto, os dois primeiros sinais em tempo real são excluídos da faixa de sinais em tempo real.

caos
fonte
Então, como obter o valor atual de SIGRTMIN em tempo de execução em um pedaço de código em execução?
SlySven 29/02
10

Porque os sinais são:

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

Nenhum dos quais é suportado no Linux. (LWP significa LightWeight Process )

Fonte: IBM DeveloperWorks Solaris para Linux Guia de Portabilidade

garethTheRed
fonte
O Linux tinha sinal 32 e 33. Veja: unixhelp.ed.ac.uk/CGI/man-cgi?signal+7 , Real-time Signalsseção.
cuonglm
@Gnouc - de acordo com o kill -l RTMINinício em 34, e não 32, conforme o documento referenciado. Este diz que começa em 33, mas continua dizendo que você não deve fazer referência a eles por números, pois os números podem variar dependendo da implementação do glibc threading.
GarethTheRed
É claro que varia de acordo com o sistema, mas o termo Linux não é suportado. Você pode consultar isso: cse.psu.edu/~dheller/cmpsc311/Lectures/Process-Control-Signals/… . Talvez precisemos de um vererano que trabalhe com o Linux há muito tempo para nos informar o que acontece com os sinais 32, 33. Por que eles não estão documentados.
cuonglm
Eles são usados ​​internamente pela biblioteca RT pthread - e no passado havia três e não dois, porque um sistema diferente usava muitos deles para fins internos. Do ponto de vista da codificação, você não deve usar constantes em tempo de compilação para os sinais acima do SIGSYS, por exemplo, um SIGRTMINconjunto com uma #definelinha porque esse número está sujeito a possíveis alterações posteriormente quando o executável for executado. Isso teria aparecido alguns anos atrás, quando as duas bibliotecas pthread estavam em uso se um aplicativo compilado na biblioteca pthread fosse executado em um sistema que foi reiniciado com a outra!
SlySven 29/02