Dlaczego `kill -l` nie wyświetla numerów sygnałów 32 i 33?


18

Wykonanie kill -lna Linuksie daje:

 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

Co się stało 32i 33? Dlaczego nie ma go na liście? Mogliby zacząć od 1 i skończyć na 62 zamiast pomijać 2 w środku?


PS Nie ma „kodów błędów” - to numery sygnałów.
G-Man mówi „Przywróć Monikę”

Odpowiedzi:


20

To z powodu NPTL . Ponieważ jest częścią biblioteki GNU C, prawie każda nowoczesna dystrybucja linuksa nie wykorzystuje już dwóch pierwszych sygnałów w czasie rzeczywistym. NPTL jest implementacją wątków POSIX . NPTL wykorzystuje wewnętrznie dwa pierwsze sygnały w czasie rzeczywistym.

Ta część strony sygnału jest bardzo interesująca:

Jądro Linux obsługuje zakres 32 różnych sygnałów w czasie rzeczywistym, o numerach od 33 do 64. Jednak implementacja wątków glibc POSIX używa wewnętrznie dwóch (dla NPTL) lub trzech (dla LinuxThreads) sygnałów w czasie rzeczywistym (patrz pthreads (7)) i odpowiednio dostosowuje wartość SIGRTMIN (do 34 lub 35). Ponieważ zakres dostępnych sygnałów w czasie rzeczywistym różni się w zależności od implementacji wątków glibc (a ta zmiana może wystąpić w czasie wykonywania zgodnie z dostępnym jądrem i glibc), a nawet zakres sygnałów w czasie rzeczywistym różni się w zależności od systemu UNIX, programy powinny nigdy nie odnoszą się do sygnałów w czasie rzeczywistym za pomocą liczb zakodowanych na stałe, ale zamiast tego powinny zawsze odnosić się do sygnałów w czasie rzeczywistym przy użyciu zapisu SIGRTMIN + n oraz zawierać odpowiednie (w czasie wykonywania) kontrole, czy SIGRTMIN + n nie przekracza SIGRTMAX.

Sprawdziłem również kod źródłowy glibc; patrz wiersz 22 . __SIGRTMINjest zwiększone +2, więc pierwsze dwa sygnały w czasie rzeczywistym są wyłączone z zakresu sygnałów w czasie rzeczywistym.


Jak więc uzyskać bieżącą wartość SIGRTMIN w czasie wykonywania w kawałku kodu?
SlySven

10

Ponieważ sygnały to:

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

Żaden z nich nie jest obsługiwany w systemie Linux. (LWP oznacza LightWeight Process )

Źródło: IBM DeveloperWorks Solaris to Linux Przewodnik po portach


Linux miał sygnał 32 i 33. Patrz: unixhelp.ed.ac.uk/CGI/man-cgi?signal+7 , Real-time Signalssekcja.
cuonglm

@Gnouc - zgodnie z kill -l RTMINpoczątkiem od 34, a nie od 32 według dokumentu, do którego się odwołujesz. Ten mówi, że zaczyna się od 33, ale mówi dalej, że nie powinieneś odwoływać się do nich liczbami, ponieważ liczby mogą się różnić w zależności od implementacji wątków glibc.
garethTheRed

Oczywiście różni się w zależności od systemu, ale termin Linux nie jest obsługiwany jest niepoprawny. Możesz odnieść się do tego: cse.psu.edu/~dheller/cmpsc311/Lectures/Process-Control-Signals/… . Może potrzebujemy vereran, który współpracuje z Linuksem dawno temu, aby poinformować nas, co się stanie z sygnałem 32, 33. Dlaczego nie są one udokumentowane.
cuonglm

Są one używane wewnętrznie przez bibliotekę pthread RT - w przeszłości byłyby trzy, a nie dwie, ponieważ inny system używał ich tak wielu do celów wewnętrznych. Z punktu widzenia kodowania nie należy używać stałych czasowych kompilacji dla sygnałów powyżej SIGSYS, np. Zestawu SIGRTMINz #definelinią, ponieważ liczba ta może ulec zmianie później, gdy plik wykonywalny zostanie uruchomiony. Pojawiłoby się to kilka lat temu, gdy obie biblioteki pthread były w użyciu, gdyby aplikacja skompilowana dla jednej biblioteki pthread została uruchomiona w systemie, który został ponownie uruchomiony z drugim!
SlySven
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.