Функции блокировки и 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, вам нужно просто не игнорировать сигнал. Действие выхода по умолчанию может быть тем, что вы хотите, или вы можете написать собственный обработчик сигнала, чтобы сделать что-то еще.

Другие вопросы по тегам