Функции блокировки и EINTR
Многие функции блокировки POSIX возвращают EINTR в случае сигнала. Идея состоит в том, что обработчик сигнала сначала устанавливает флаг (скажем, флаг 'stop' в случае SIGINT), затем функция блокировки разблокирует возвращаемый EINTR, и приложение видит флаг и выполняет упорядоченное завершение работы (или что-то еще).
Однако для некоторых функций блокировки, таких как pthread_mutex_lock и pthread_cond_wait, ошибки EINTR нет.
Что за идея стоит за этим? Как приложения, использующие эти функции, должны обрабатывать сигналы (в частности, Ctrl+C)?
2 ответа
Нет ответа. Я предполагаю, что pthread_cond_wait() и SIGINT не могут быть объединены, чтобы выполнить чистое завершение работы. Используйте sem_wait() или аналогичный вместо pthread_cond_wait().
Как правило, только системные вызовы (вызовы низкого уровня ОС) возвращают EINTR. Стандартные вызовы более высокого уровня не выполняются. Так, например, read
а также write
может вернуть EINTR, но printf
а также gets
не буду.
Как правило, правильно поступить при получении EINTR
чтобы повторить вызов - вот почему флаг SA_RESTART на обработчиках сигналов существует. Если вы хотите обрабатывать Ctrl-C, вам нужно просто не игнорировать сигнал. Действие выхода по умолчанию может быть тем, что вы хотите, или вы можете написать собственный обработчик сигнала, чтобы сделать что-то еще.