LINUX.ORG.RU

История изменений

Исправление 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() одиночный сигнал на завершение работы будет получен приложением.