Классический способ указать обработчик для определенного сигнала через sigaction
. Linux дополнительно предоставляет функциональность signalfd
, где мы можем подключать сигналы к файловому дескриптору, а затем применять select/(e) опрос к этому дескриптору, который идеально подходит для концепции многих систем, управляемых циклом событий.Может ли быть гонка между signalfd и sigaction?
Мне интересно, что произойдет/произойдет, когда оба механизма столкнутся. Могут ли быть условия гонки? На signalfd страницы руководства (http://man7.org/linux/man-pages/man2/signalfd.2.html) мы читаем:
Как правило, набор сигналов, которые будут получены с помощью дескриптора файла должен быть заблокирован с помощью sigprocmask (2), чтобы предотвратить сигналы быть обрабатываются в соответствии с их по умолчанию диспозиции.
Итак, в нем говорится: «Обычно» мы используем маску сигнала, чтобы предотвратить обработку обработчиком (по умолчанию) обработчика. Он не говорит, что мы должны блокировать этот сигнал, когда у нас есть файловый дескриптор, подключенный к нему. К сожалению, на странице руководства не указано, что происходит, когда мы не блокируем сигнал.
Это похоже на плохо определенное поведение. Я не считаю, что это на самом деле не определено, и мне интересно, знает ли кто-нибудь здесь i), я могу найти подробную информацию о том, как должна себя вести система или ii), как она себя ведет.
Что я конкретно интересует, этот порядок исполнения:
- signalfd для определенного сигнала, в том числе закупорка этого сигнала
- unblockage этого сигнала
- sigaction для этого сигнала (по умолчанию обработчик или пользовательский обработчик)
Это неопределенное поведение или есть стандарт/спецификация того, что должно произойти? Всегда ли обработчик всегда имеет приоритет над файловым дескриптором? Является ли обработчик вызванным и, дескриптор файла запускает событие? Устанавливает ли настройка sigaction
маску сигнала, шаг рендеринга (2) не нужен?
Я мог бы попытаться получить фактическое поведение от систематических тестов, связанных с фактическим кодом. Тем не менее, я, конечно, предпочитаю найти подробную документацию и считаю, что я не смог найти правильную ссылку самостоятельно.
Это, похоже, сводится к вопросу о том, оправдано ли использование * обычно * в приведенном выше описании. Игнорирование проблемы в том, что нет ничего * прекращения * любого, кто не блокирует первые сигналы, действительно ли используется префикс * не * блокировки сигналов перед использованием 'signalfd' или' sigwaitinfo'? Мне кажется, что все эти призывы состоят в том, чтобы воздействовать на * ожидающие * сигналы, чтобы обойти их варианты доставки. Поэтому я опишу его: кто-нибудь знает, где разблокированные сигналы и любой из этих вызовов имеет смысл? – Duck