Почему `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. Однако реализация потоков POSIX glibc внутренне использует два (для 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


У 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.