¿Por qué `kill -l` no enumera los números de señal de 32 y 33?

18

Ejecutar kill -len Linux da:

 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

¿Qué pasó con 32y 33? ¿Por qué no está en la lista? ¿Podrían haber comenzado en 1 y terminar en 62 en lugar de saltarse 2 en el medio?

usuario2555595
fuente
PD No hay "códigos de error", son números de señal.
G-Man dice 'reinstalar a Monica' el

Respuestas:

20

Es por NPTL . Dado que es parte de la biblioteca GNU C, casi todas las distribuciones modernas de Linux ya no usan las dos primeras señales en tiempo real. NPTL es una implementación de los hilos POSIX . NPTL hace uso interno de las dos primeras señales en tiempo real.

Esta parte de la página de manual de señales es muy interesante:

El kernel de Linux admite un rango de 32 señales diferentes en tiempo real, numeradas del 33 al 64. Sin embargo, la implementación de hilos POSIB glibc utiliza internamente dos (para NPTL) o tres (para LinuxThreads) señales en tiempo real (ver pthreads (7)) y ajusta el valor de SIGRTMIN adecuadamente (a 34 o 35). Debido a que el rango de señales disponibles en tiempo real varía de acuerdo con la implementación de subprocesos glibc (y esta variación puede ocurrir en tiempo de ejecución de acuerdo con el kernel y glibc disponibles), y de hecho el rango de señales en tiempo real varía según los sistemas UNIX, los programas deberían nunca se refiera a señales en tiempo real usando números codificados, sino que siempre debe referirse a señales en tiempo real usando la notación SIGRTMIN + n, e incluir comprobaciones adecuadas (en tiempo de ejecución) de que SIGRTMIN + n no exceda SIGRTMAX.

También verifiqué el código fuente de glibc; ver línea 22 . __SIGRTMINse incrementa +2, por lo que las dos primeras señales en tiempo real se excluyen del rango de señales en tiempo real.

caos
fuente
Entonces, ¿cómo se obtiene el valor actual de SIGRTMIN en tiempo de ejecución en un fragmento de código de ejecución?
SlySven
10

Porque las señales son:

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

Ninguno de los cuales es compatible con Linux. (LWP son las siglas de LightWeight Process )

Fuente: Guía de transferencia de IBM DeveloperWorks Solaris a Linux

garethTheRed
fuente
Linux tenía señal 32 y 33. Véase: unixhelp.ed.ac.uk/CGI/man-cgi?signal+7 , Real-time Signalssección.
Cuonglm
@Gnouc: según kill -l RTMINcomienza en 34, no en 32 según el documento de referencia. Este dice que comienza en 33, pero continúa diciendo que no debe hacer referencia a ellos por números, ya que los números pueden variar dependiendo de la implementación de subprocesos glibc.
garethTheRed
Por supuesto, varía según el sistema, pero el término que Linux no admite es incorrecto. Puede consultar esto: cse.psu.edu/~dheller/cmpsc311/Lectures/Process-Control-Signals/… . Tal vez necesitemos un veterano que trabaje con Linux hace mucho tiempo para que nos diga qué pasó con la señal 32, 33. ¿Por qué no están documentados?
Cuonglm
Son utilizados internamente por la biblioteca RT pthread, y en el pasado habría tres, no dos, porque un sistema diferente usaba tantos para fines internos. Desde el punto de vista de la codificación, no se supone que use constantes de tiempo de compilación para las señales por encima de SIGSYS, por ejemplo, un SIGRTMINconjunto con una #definelínea porque ese número está sujeto a posibles cambios más tarde cuando se ejecuta el ejecutable. ¡Esto habría aparecido hace unos años cuando ambas bibliotecas pthread estaban en uso si una aplicación compilada contra una biblioteca pthread se ejecutara en un sistema que se había reiniciado con la otra!
SlySven