[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