Pourquoi `kill -l` ne répertorie pas les numéros de signaux 32 et 33?

18

L'exécution kill -lsous Linux donne:

 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'est-il arrivé à 32et 33? Pourquoi n'est-il pas répertorié? Ils auraient pu commencer à 1 et se terminer à 62 au lieu de sauter 2 au milieu?

user2555595
la source
PS Il n'y a pas de "codes d'erreur" - ce sont des numéros de signal.
G-Man dit `` Réintègre Monica '' le

Réponses:

20

C'est à cause de NPTL . Comme il fait partie de la bibliothèque GNU C, presque toutes les distributions Linux modernes n'utilisent plus les deux premiers signaux en temps réel. NPTL est une implémentation des threads POSIX . NPTL utilise en interne les deux premiers signaux en temps réel.

Cette partie de la page de manuel du signal est très intéressante:

Le noyau Linux prend en charge une gamme de 32 signaux en temps réel différents, numérotés de 33 à 64. Cependant, l'implémentation des threads glibc POSIX utilise en interne deux (pour NPTL) ou trois (pour LinuxThreads) signaux en temps réel (voir pthreads (7)) et ajuste la valeur de SIGRTMIN de manière appropriée (à 34 ou 35). Étant donné que la plage de signaux en temps réel disponibles varie en fonction de l'implémentation du filetage de la glibc (et cette variation peut se produire au moment de l'exécution en fonction du noyau et de la glibc disponibles), et en fait la plage de signaux en temps réel varie d'un système UNIX à l'autre, les programmes doivent ne faites jamais référence à des signaux en temps réel en utilisant des nombres codés en dur, mais au lieu de cela, faites toujours référence à des signaux en temps réel en utilisant la notation SIGRTMIN + n, et incluez des vérifications appropriées (au moment de l'exécution) que SIGRTMIN + n ne dépasse pas SIGRTMAX.

J'ai également vérifié le code source de la glibc; voir ligne 22 . __SIGRTMINest augmenté de +2, de sorte que les deux premiers signaux en temps réel sont exclus de la plage des signaux en temps réel.

le chaos
la source
Alors, comment obtient- on la valeur actuelle de SIGRTMIN au moment de l'exécution dans un morceau de code d'exécution?
SlySven
10

Parce que les signaux sont:

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

Aucun d'eux n'est pris en charge sous Linux. (LWP signifie LightWeight Process )

Source: IBM DeveloperWorks Solaris to Linux Porting Guide

garethTheRed
la source
Linux avait les signaux 32 et 33. Voir: unixhelp.ed.ac.uk/CGI/man-cgi?signal+7 , Real-time Signalssection.
cuonglm
@Gnouc - selon kill -l RTMINcommence à 34, pas 32 selon votre document référencé. Celui-ci dit qu'il commence à 33, mais continue en disant que vous ne devriez pas les référencer par des nombres car les nombres peuvent varier en fonction de l'implémentation du thread glibc.
garethTheRed
Bien sûr, cela varie en fonction du système, mais le terme que Linux ne prend pas en charge est incorrect. Vous pouvez vous référer à ceci: cse.psu.edu/~dheller/cmpsc311/Lectures/Process-Control-Signals/… . Peut-être que nous avons besoin d'un vereran qui a travaillé avec Linux il y a longtemps pour nous faire savoir ce qui se passe avec le signal 32, 33. Pourquoi ne sont-ils pas documentés?
cuonglm
Ils sont utilisés en interne par la bibliothèque RT pthread - et dans le passé, il y en aurait trois et non deux car un système différent en utilisait autant à des fins internes. Du point de vue du codage, vous n'êtes pas censé utiliser des constantes de temps de compilation pour les signaux au-dessus de SIGSYS, par exemple un SIGRTMINensemble avec une #defineligne parce que ce nombre est susceptible d'être modifié ultérieurement lors de l'exécution de l'exécutable. Cela se serait révélé il y a quelques années lorsque les deux bibliothèques pthread étaient utilisées si une application compilée avec l'une des bibliothèques pthread était exécutée sur un système qui avait été redémarré avec l'autre!
SlySven