Perché `kill -l` non elenca i numeri di segnale di 32 e 33?


18

L'esecuzione kill -lsu Linux dà:

 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

Che cosa è successo 32e 33? Perché non è elencato? Avrebbero potuto iniziare a 1 e terminare a 62 invece di saltare 2 nel mezzo?


PS Non ci sono "codici di errore": sono numeri di segnale.
G-Man dice 'Reinstate Monica' il

Risposte:


20

È a causa di NPTL . Dal momento che fa parte della libreria GNU C quasi tutte le moderne distribuzioni linux non usano più i primi due segnali in tempo reale. NPTL è un'implementazione dei thread POSIX . NPTL fa uso interno dei primi due segnali in tempo reale.

Questa parte della manpage del segnale è molto interessante:

Il kernel Linux supporta una gamma di 32 diversi segnali in tempo reale, numerati da 33 a 64. Tuttavia, l'implementazione dei thread POSIX glibc utilizza internamente due segnali in tempo reale (per NPTL) o tre (per LinuxThreads) (vedi pthreads (7)) e regola opportunamente il valore di SIGRTMIN (su 34 o 35). Poiché la gamma di segnali in tempo reale disponibili varia in base all'implementazione del threading glibc (e questa variazione può verificarsi in fase di esecuzione in base al kernel e aglibc disponibili), e in effetti la gamma di segnali in tempo reale varia tra i sistemi UNIX, i programmi dovrebbero non fare mai riferimento a segnali in tempo reale utilizzando numeri con codice fisso, ma invece dovrebbe sempre fare riferimento a segnali in tempo reale utilizzando la notazione SIGRTMIN + n e includere adeguati controlli (runtime) che SIGRTMIN + n non superi SIGRTMAX.

Ho anche controllato il codice sorgente per glibc; vedi riga 22 . __SIGRTMINviene aumentato di +2, quindi i primi due segnali in tempo reale sono esclusi dall'intervallo dei segnali in tempo reale.


Quindi, come si ottiene il valore corrente di SIGRTMIN in fase di esecuzione in un pezzo di codice di esecuzione?
SlySven,

10

Perché i segnali sono:

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

Nessuno dei due è supportato in Linux. (LWP significa LightWeight Process )

Fonte: IBM DeveloperWorks Guida al porting da Solaris a Linux


Linux aveva il segnale 32 e 33. Vedi: unixhelp.ed.ac.uk/CGI/man-cgi?signal+7 , Real-time Signalssezione.
cuonglm,

@Gnouc - in base a kill -l RTMINinizia a 34, non a 32 come da documento di riferimento. Questo dice che inizia da 33, ma continua dicendo che non dovresti fare riferimento a loro in base ai numeri poiché i numeri possono variare a seconda dell'implementazione del threading glibc.
garethTheRed,

Naturalmente varia in base al sistema, ma il termine Linux non supportato non è corretto. Puoi fare riferimento a questo: cse.psu.edu/~dheller/cmpsc311/Lectures/Process-Control-Signals/… . Forse abbiamo bisogno di un vereran che lavora con Linux molto tempo fa per farci sapere cosa succede con il segnale 32, 33. Perché non sono documentati.
cuonglm,

Sono usati internamente dalla libreria pthread di RT - e in passato ce ne sarebbero stati tre non due perché un sistema diverso ne usava molti per scopi interni. Dal punto di vista della codifica, non è necessario utilizzare costanti di compilazione per i segnali sopra SIGSYS, ad esempio un SIGRTMINset con una #definelinea, poiché tale numero è soggetto a possibili modifiche in seguito quando viene eseguito l'eseguibile. Questo sarebbe apparso qualche anno fa quando entrambe le librerie pthread erano in uso se un'applicazione compilata su una libreria pthread fosse stata eseguita su un sistema che era stato riavviato con l'altro!
SlySven,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.