[sisyphus] Q: Очень непростой вопрос на тему select() и сигналов

Mikhail Efremov sem на altlinux.ru
Пт Апр 10 13:40:09 MSD 2009


On Friday 10 April 2009 05:50:01 Michael Pozhidaev wrote:

> Ага, спасибо! Но переспрошу ещё раз:
> 1. я заблокировал SIGCHLD;
> 2. после этого SIGCHLD был послан моему процессу;
> 3. я вызвал pselect() у которого в маске SIGCHLD разрешён;
> 4. pselect() увидит, что за период блокировки сигнала он был пойман и
> СРАЗУ ЖЕ ЗАВЕРШИТ свою работу с EINTR.
> При этом обработчик сигнала будет вызван, просто немного отложен.
> Правильно? Это гарантируется системой? Трюк с pipe(), чтобы
> проинформировать о сигнале пока трогать не буду. Потом может как-нибудь.

Все так, это гарантируется стандартом. Вот только стандарт стандартом, а его 
конкретная реализация - это конкретная реализация, в той или иной степени 
этот стандарт поддерживающая. Раньше в Linux не было системного вызова  
pselect, была эмуляция в glibc, проблемы не решающая. Начиная с 2.6.какой-то 
версии ядра такой вызов есть, но я не знаю как он работает. Впрочем, не 
думаю, что есть смысл делать системный вызов, не решающий проблему с race. 
Может кто из знатоков ядра скажет по этому поводу больше.

-- 
WBR, Mikhail Efremov


Подробная информация о списке рассылки Sisyphus