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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.