История изменений
Исправление mky, (текущая версия) :
У меня программа спит в select()'е и по EINTR оглядывается на флаги вокруг.
Типичная ошибка в этом случае, это код типа:
if ( ! flag ) select(nfds, readfds, writefds,exceptfds, NULL);
То есть, select() без таймаута. Сигнал может придти после проверки flag (выставляемого в обработчике) и перед вызовом select.
Поэтому, либо pselect(), либо таймаут в select() и проверка флага независимо от результата select(), либо ещё один файловый дескриптор в select(), который может быть, или signalfd(), или pipe'ом, в который пишет обработчик сигнала.
Старая семантика это signal(), новая это sigaction(), в ″man 2 signal″ есть раздел про его особенности, но потеря сигнала из-за использования signal() вместо sigaction() — это особенности стандарта, а не недостатки ядра. Но даже с signal() одиночный сигнал на завершение работы будет получен приложением.
Исходная версия mky, :
У меня программа спит в select()'е и по EINTR оглядывается на флаги вокруг.
Типичная ошибка в этом случае, это код типа:
if ( ! flag ) select(nfds, readfds, writefds,exceptfds, NULL);
То есть, select() без таймаута. Сигнал может придти после проверки flag (выставляемого в обработчике) и вызовом select.
Поэтому, либо pselect(), либо таймаут в select() и проверка флага независимо от результата select(), либо ещё один файловый дескриптор в select(), который может быть, или signalfd(), или pipe'ом, в который пишет обработчик сигнала.
Старая семантика это signal(), новая это sigaction(), в ″man 2 signal″ есть раздел про его особенности, но потеря сигнала из-за использования signal() вместо sigaction() — это особенности стандарта, а не недостатки ядра. Но даже с signal() одиночный сигнал на завершение работы будет получен приложением.