LINUX.ORG.RU

sleep и SIGCHLD


0

1

Доброго времени суток!

Возникла проблема, никак не могу понять, как ее решить.

Почему nanosleep прерывается по сигналу SIGCHLD только в случае если явно повесить обработчик.

Пробовал делать SIG_UNBLOCK и назначение SIG_DFL для SIGCHLD, но без явно проставленного обработчика nanosleep (sleep и usleep тоже) не прерывается. Самое странное, что обработчик может быть пустым (то есть не попрождать SIGALRM и вообще ничего не делать).

Можно ли разрешить обработку в nanosleep сигнала без явного определения его обработчика?

Как я думаю, надо курить в сторону sigmask или еще чего-то в этом же духе?

Debian Linux unstable, x86_64

Спасибо

The sleep() function shall cause the calling thread to be suspended from execution until either the number of realtime seconds specified by the argument seconds has elapsed or a signal is delivered to the calling thread and its action is to invoke a signal-catching function or to terminate the process. The suspension time may be longer than requested due to the scheduling of other activity by the system.

Это из SUSv4. При SIG_IGN/SIG_DFL ни функция не вызывается, ни процесс не завершается, так что так и должно быть.

arturpub ★★
()
Ответ на: комментарий от arturpub

Досадно. Я думал, что может есть какой-то обработчик по умолчанию для этого сигнала, и включение этого обработчика позволило бы решить мою проблему.

Просто вещать свой пустой обработчик мне кажется не самым красивым решением

kirichenkoga
() автор топика

можно еще select'ом спать. один из профитов - тебе через параметр timeout скажут сколько тебе досыпать после того, как select прервался сигналом. правда, этот профит и непортабельный :)

BreadFan ★★
()
Ответ на: комментарий от kirichenkoga

Думаю, нормальное решение. Я так и делаю. Программа ловит сигналы через sigwait и на линуксе все гладко, а на FreeBSD SIGCHLD при дефолтной диспозиции не приходит, не смотря на то, что заблокирован перед sigwait и содержится в маске, которую я передаю. Повесил пустой обработчик и все стало хорошо.

ratatosk
()
Ответ на: комментарий от ratatosk

Странно, а у меня и на Linux не хавает через sigwait (ядро 2.6.39). Может быть дело в том, что у меня многопоточное приложение и sigwait я делаю не в главном потоке?

kirichenkoga
() автор топика
Ответ на: комментарий от kirichenkoga

Главное, чтобы этот SIGCHLD был во всех потоках заблокирован.

ratatosk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.