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

Michael Pozhidaev msp на altlinux.ru
Пт Апр 10 05:50:01 MSD 2009


Hello, Mikhail Efremov!

> Да, что-то вроде
> if (pselect(required_fds, and_signal_mask_with_enabled_sigchld) <0)
> 	if(errno == EINTR)
> 		check_sigchld();
Угу, это понятно.

>
>> Если должно быть так, то что произойдёт, если sigchld пришёл в тот
>> краткий момент, когда он был заблокирован? pselect() увидит, что пока
>> сигнал был заблокирован, он приходил, и нужно сразу прекратить ожидание,
>> вызвать его обработчик и дать программе его обработать? Если нет, то
>> тогда мы вообще теряем получение SIGCHLD. Ещё есть интересная функция
>> sigpending(), но уместна ли она здесь, вот это непонятно.
>
> Блокировка сигнала != игнорирование сигнала. Блокированный сигнал не 
> потеряется, просто не будет вызван обработчик пока его не разблокируют, что и 
> делает pselect. А sigpending() думаю тут не нужен.
Ага, спасибо! Но переспрошу ещё раз:
1. я заблокировал SIGCHLD;
2. после этого SIGCHLD был послан моему процессу;
3. я вызвал pselect() у которого в маске SIGCHLD разрешён;
4. pselect() увидит, что за период блокировки сигнала он был пойман и
СРАЗУ ЖЕ ЗАВЕРШИТ свою работу с EINTR. 
При этом обработчик сигнала будет вызван, просто немного отложен.
Правильно? Это гарантируется системой? Трюк с pipe(), чтобы
проинформировать о сигнале пока трогать не буду. Потом может как-нибудь.
-- 
Michael Pozhidaev. E-mail: msp на altlinux.ru.
Tomsk State University. http://www.csd.tsu.ru
ALT Linux Team. http://www.altlinux.org



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