LINUX.ORG.RU

perl + ipc + signals


0

0
Блин, Привет всем.

Есть демон, который ставит обработчик на допустим SIGINT, SIGALRM.
$SIG{ALRM} = sub{ ... };
И он еще создает N-е количество потомков, у которых тоже ставятся эти обработчики...
Идея такая - По СигИнту главному процессу он рассылает ИНТЫ потомкам, они в свою очередь уходят в Слип пока не получат СИГАЛРМ который соответственно им посылает Родитель.

Так вот, почему обработчик ИНТА пашет, а АЛРМ или любой другой который на выход из слипа - нет?

Зарание спасибо.
А потому что sleep сигналами не обрывается во первых, а во вторых использовать SIGALRM со слипом настойчиво не рекомендуется по причине непредсказуемости поведения
cvv ★★★★★
()
Ответ на: комментарий от cvv
> А потому что sleep сигналами не обрывается во первых

обрывается обязательно! sys_nanosleep() всегда
возвращает EINTR, даже если обработчик сигнала
имел SA_RESTART.

другое дело, что если нужно ждать сигнала, лучше
использовать sys_pause(), в perl это будет вызов
sleep без параметра.
idle ★★★★★
()
Ответ на: комментарий от cvv
гон :)
тем более что я делаю через переменную с проверкой :)

Проблемма то не в слипе... я же написал - обработчик вообще не обрабатывается по сигналу Ж(
godexsoft
() автор топика
Ответ на: комментарий от idle
>обрывается обязательно! sys_nanosleep() всегда возвращает EINTR, даже если обработчик сигнала имел SA_RESTART.

я сомневаюсь что у него слип реализован через sys_nanosleep().

откудова я предполагаю и лезут грабли

cvv ★★★★★
()
Ответ на: комментарий от cvv
Забэй :)
я уже придумал более простой способ.. граблей быть уже не может по определению :)

Спасибо в любом случае :)
godexsoft
() автор топика
Ответ на: комментарий от godexsoft
>Проблемма то не в слипе... я же написал - обработчик вообще не обрабатывается по сигналу Ж(

я предполагаю что проблема в том что сигнал просто не доходит до процесса следственно никто никого не вызывает.

ну есть ещё маловероятный вариант что ты ещё что намудрил с установкой обзаботчиков или флагами при установке обработчиков

cvv ★★★★★
()
Ответ на: комментарий от cvv
> я сомневаюсь что у него слип реализован через sys_nanosleep().

единственная альтернатива - alarm + pause, perl этого
не делает, и использует sleep из libc, а она уже nanosleep.
idle ★★★★★
()
Ответ на: комментарий от cvv
неа... процесс дохнит от сигнала... по той или иной причине обработчик вообще не регистрировали :(
godexsoft
() автор топика
Ответ на: комментарий от idle
>sleep из libc, а она уже nanosleep.

Я такого незнал. Это наверное только под линуксом? обычно в манах везде упоминают связку alarm + pause то я о другом и не думал

cvv ★★★★★
()
хых.. новая трабла.
если у меня в чайлде такое:

my $gotosleep = 0;
$SIG{INT} = sub { $gotosleep = 1; };
while(<some>){
if($gotosleep){
# Some actions
exit 0;
}

# Do stuff
}

то почему блин получается по получении сигинта оно все равно проходит луп один раз и только на второй раз $gotosleep == 1?
че з епт Ж(
godexsoft
() автор топика
Ответ на: комментарий от cvv
> Это наверное только под линуксом?

фиг его знает... но, вообще-то, nanosleep() стандартная
вещь, я бы предположил что все ее используют. я вот
только не знаю, зачем sleep() блокирует SIGCHLD.

собственно, я думаю sleep() устарела, и не надо ей вообще
пользоваться.

у кого есть исходники perl 5.8? что там в pp_sys.c:pp_sleep ?
idle ★★★★★
()
Ответ на: комментарий от idle
PP(pp_sleep)
{
    dSP; dTARGET;
    I32 duration;
    Time_t lasttime;
    Time_t when;

    (void)time(&lasttime);
    if (MAXARG < 1)
	PerlProc_pause();
    else {
	duration = POPi;
	PerlProc_sleep((unsigned int)duration);
    }
    (void)time(&when);
    XPUSHi(when - lasttime);
    RETURN;
}
kosmonavt
()
Ответ на: комментарий от idle
>вообще-то, nanosleep() стандартная вещь, я бы предположил что все ее используют

точнее пытаются использовать по мере доступности. если посмотреть исходники различны кросплатформенных либ(например глиб) с собственной реализацией sleep() то легко понять что довольно много народу её не поддерживает и на такой случай тама кроме nanosleep() есть масса различных извращений типа select() ...

cvv ★★★★★
()
Ответ на: комментарий от kosmonavt
kosmonavt:
>
>         duration = POPi;
>         PerlProc_sleep((unsigned int)duration);

спасибо. а ведь, вроде бы, ходили слухи переделать
этот op-code, чтобы можно было указывать время как
float?

значит, не сделали, или я что-то напутал.
idle ★★★★★
()
Ответ на: комментарий от idle
iperlsys.h:
#define PerlProc_sleep(t)						\
	(*PL_Proc->pSleep)(PL_Proc, (t))
----------------------------------------
Дальше пока не отследил. Идут какие-то инициализации, в зависимости
от установленных макроопределений.
kosmonavt
()
Ответ на: комментарий от kosmonavt
kosmonavt:

> (*PL_Proc->pSleep)(PL_Proc, (t))

нет, там, в этом же файле ниже должно быть,
это если defined(PERL_IMPLICIT_SYS).
idle ★★★★★
()
Ответ на: комментарий от godexsoft
> чето вы тут разошлись нипадецки :))

ага... сразу видно тех, кому работать ну никак
не хочется :)
idle ★★★★★
()
Ответ на: комментарий от idle
а у меня весь день болела голова, вообще на работе сидел тупил просто.. еще и в гребанную автошколу вечером.. вот тока вернулся :)
godexsoft
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.