Warum listet "kill -l" die Signalnummern 32 und 33 nicht auf?

18

Die Ausführung kill -lunter Linux ergibt:

 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

Was ist mit 32und passiert 33? Warum ist es nicht aufgeführt? Sie hätten bei 1 beginnen und bei 62 enden können, anstatt 2 in der Mitte auszulassen?

user2555595
quelle
PS Es gibt keine "Fehlercodes" - es handelt sich um Signalnummern.
G-Man sagt, dass Monica

Antworten:

20

Es ist wegen NPTL . Da es Teil der GNU C-Bibliothek ist, verwendet fast jede moderne Linux-Distribution nicht mehr die ersten beiden Echtzeitsignale. NPTL ist eine Implementierung der POSIX-Threads . NPTL verwendet intern die ersten beiden Echtzeitsignale.

Dieser Teil der Signalmanpage ist sehr interessant:

Der Linux-Kernel unterstützt 32 verschiedene Echtzeitsignale mit den Nummern 33 bis 64. Die Implementierung der glibc-POSIX-Threads verwendet jedoch intern zwei (für NPTL) oder drei (für LinuxThreads) Echtzeitsignale (siehe pthreads (7)). , und passt den Wert von SIGRTMIN entsprechend an (auf 34 oder 35). Da der Bereich der verfügbaren Echtzeitsignale je nach Implementierung des Glibc-Threading variiert (und diese Variation zur Laufzeit je nach verfügbarem Kernel und Glibc auftreten kann) und in der Tat der Bereich der Echtzeitsignale je nach UNIX-System variiert, sollten Programme dies tun Beziehen Sie sich niemals auf Echtzeitsignale mit fest codierten Zahlen, sondern sollten Sie sich immer auf Echtzeitsignale mit der Notation SIGRTMIN + n beziehen und geeignete (Laufzeit-) Überprüfungen einschließen, dass SIGRTMIN + n SIGRTMAX nicht überschreitet.

Ich habe auch den Quellcode auf glibc überprüft. siehe Linie 22 . __SIGRTMINwird +2 erhöht, so dass die ersten beiden Echtzeitsignale aus dem Bereich der Echtzeitsignale ausgeschlossen werden.

Chaos
quelle
Also wie kann man erhält den aktuellen Wert von SIGRTMIN zur Laufzeit in einem Stück Code ausführen?
SlySven
10

Weil die Signale sind:

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

Beides wird unter Linux nicht unterstützt. (LWP steht für LightWeight Process )

Quelle: IBM DeveloperWorks Solaris zu Linux-Portierungshandbuch

garethTheRed
quelle
Linux hatte die Signale 32 und 33. Siehe: unixhelp.ed.ac.uk/CGI/man-cgi?signal+7 , Real-time SignalsAbschnitt.
16.
@Gnouc - gemäß kill -l RTMINbeginnt bei 34, nicht bei 32 gemäß dem von Ihnen angegebenen Dokument. Dieser besagt, dass er bei 33 beginnt, aber Sie sollten sie nicht mit Zahlen referenzieren, da die Zahlen je nach Implementierung von Glibc-Threading variieren können.
garethTheRed
Natürlich variiert es je nach System, aber der Begriff, den Linux nicht unterstützt, ist falsch. Sie können dies verweisen: cse.psu.edu/~dheller/cmpsc311/Lectures/Process-Control-Signals/… . Vielleicht brauchen wir einen Vereran, der vor langer Zeit mit Linux gearbeitet hat, um uns wissen zu lassen, was mit Signal 32, 33 passiert. Warum sind sie nicht dokumentiert?
Donnerstag,
Sie werden intern von der RT-pthread-Bibliothek verwendet - und in der Vergangenheit gab es drei statt zwei, da ein anderes System so viele für interne Zwecke verwendete. Aus Sicht der Codierung sollten Sie für die Signale oberhalb von SIGSYS keine Konstanten für die Kompilierungszeit verwenden, z. B. ein SIGRTMINSet mit einer #defineLinie, da diese Nummer möglicherweise später geändert wird, wenn die ausführbare Datei ausgeführt wird. Dies hätte sich vor einigen Jahren gezeigt, als beide pthread-Bibliotheken verwendet wurden, wenn eine Anwendung, die mit der einen pthread-Bibliothek kompiliert wurde, auf einem System ausgeführt wurde, das mit dem anderen neu gestartet wurde!
SlySven