Чому `kill -l` не відображає числа сигналів 32 і 33?


18

Виконання kill -lна linux дає:

 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

Що сталося 32і 33? Чому його не вказано? Вони могли початися з 1 і закінчилися в 62, замість того, щоб пропустити 2 посередині?


PS Не існує "кодів помилок" - це сигнальні номери.
G-Man каже: "Відновіть Моніку"

Відповіді:


20

Це через NPTL . Оскільки вона є частиною бібліотеки GNU C, майже кожен сучасний дистрибутив Linux більше не використовує перші два сигнали в реальному часі. NPTL - це реалізація потоків POSIX . NPTL використовує внутрішнє використання перших двох сигналів у режимі реального часу.

Ця частина сигнальної сторінки дуже цікава:

Ядро Linux підтримує діапазон з 32 різних сигналів у режимі реального часу, пронумерованих від 33 до 64. Однак реалізація потоків glibc POSIX внутрішньо використовує два (для NPTL) або три (для LinuxThreads) сигналів у реальному часі (див. Pthreads (7)) , і відповідним чином коригує значення SIGRTMIN (до 34 або 35). Оскільки діапазон доступних сигналів у режимі реального часу змінюється залежно від реалізації потоку glibc (і ця варіація може виникати під час виконання відповідно до наявних ядер та glibc), і дійсно діапазон сигналів у реальному часі змінюється в системах UNIX, програми повинні ніколи не посилайтеся на сигнали в реальному часі, використовуючи жорстко кодовані номери, а натомість завжди слід посилатися на сигнали в реальному часі, використовуючи позначення SIGRTMIN + n, і включати відповідні перевірки (час виконання), що SIGRTMIN + n не перевищує SIGRTMAX.

Я також перевірив вихідний код на glibc; див. рядок 22 . __SIGRTMINзбільшується +2, тому перші два сигнали реального часу виключаються з діапазону сигналів реального часу.


Тож як можна отримати поточне значення SIGRTMIN під час виконання у фрагменті виконуваного коду?
SlySven

10

Тому що сигнали:

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

Жоден з них не підтримується в Linux. (LWP означає LightWeight Process )

Джерело: Посібник IBM DeveloperWorks Solaris для Linux Porting


У Linux були сигнали 32 та 33. Див.: Unixhelp.ed.ac.uk/CGI/man-cgi?signal+7 , Real-time Signalsрозділ.
cuonglm

@Gnouc - відповідно до kill -l RTMIN34, а не 32 відповідно до посилається на вас документом. Цей говорить, що він починається з 33, але продовжує говорити, що не слід посилатися на них за номерами, оскільки цифри можуть змінюватися в залежності від реалізації потоку glibc.
garethTheRed

Звичайно, це залежно від системи, але термін Linux не підтримується є неправильним. Ви можете посилатися на це: cse.psu.edu/~dheller/cmpsc311/Lectures/Process-Control-Signals/… . Можливо, нам потрібен вереран, який давно працював з Linux, щоб повідомити нам, що відбувається з сигналом 32, 33. Чому вони не задокументовані.
cuonglm

Вони використовуються всередині бібліотеки pthread RT - і раніше їх було б три, а не дві, оскільки інша система використовувала цю кількість для внутрішніх цілей. З точки зору кодування, ви не повинні використовувати константи часу компіляції для сигналів вище SIGSYS, наприклад, SIGRTMINнабір з #defineрядком, оскільки це число може бути змінено пізніше, коли виконується виконуваний файл. Це було б показано кілька років тому, коли обидва файли pthread використовувались, якби програма, складена проти однієї бібліотеки pthread, запускалася у системі, яка була перезавантажена з іншою!
SlySven
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.