Роббинс Арнольд
Шрифт:
Обратите внимание, что параметр
Строки 86–90 представляют действительный цикл, повторно осуществляющий операцию, пока она завершается ошибкой
В строке 18
10.4.4.2. Только GLIBC:
Файл <unistd.h> GLIBC определяет макрос TEMP_FAILURE_RETRY, который вы можете использовать для инкапсулирования любого системного вызова, который может при неудачном вызове установить errno в EINTR. Его «объявление» следующее:
Вот определение макроса:
Макрос использует расширение GCC к языку С (как обозначено ключевым словом
Используя этот макрос, мы могли бы переписать
10.4.5. Состояния гонок и
Пока обработка одного сигнала за раз выглядит просто: установка обработчика сигнала в
Но что произойдет, если возникнут два идентичных сигнала, один за другим? В частности, что, если ваша система восстановит действие по умолчанию для вашего сигнала, а второй сигнал появится после вызова обработчика, но до того, как он себя восстановит?
Или предположим, что вы используете
Оба случая относятся к состоянию гонки. Одним решением для этих проблем является как можно большее упрощение обработчиков сигналов. Это можно сделать, создав флаговые переменные, указывающие на появление сигнала. Обработчик сигнала устанавливает переменную в true и возвращается. Затем основная логика проверяет флаговую переменную в стратегических местах: