LINUX.ORG.RU

fork->alarm->waitpid->fork->alram ?


0

0

Помогите решить проблему, плз!

Есть демон, который запускает некоторый набор функций в отдельных дочерних процессах и потом следит за состоянием каждого из них опрашивая по сигналу SIGALRM при помощи waitpid каждого потомка. Если потомок завершился, сервер перезапускает его функцию в новом дочернем процессе.

Все дочерние процессы однотипны и совершают некоторые действия по таймеру, каждый раз переустанавливая таймер на очередной вызов: void func(int sig) { if ( sig == SIGUSR2 ) exit(0); /* некое действие */ ....

signal(SIGALRM,func); alarm(alarm_time); }

все бы хорошо, но если один из дочерних процессов вываливается а потом перезапускается сновным процессом демона, то сигнал SIGALRM он больше получить не может, то-ли signal() не срабатывает то-ли таймер в alarm() не устанавливается :-( не пойму

Что не так?

anonymous

я правильно понял, fork() в обработчике SIGALRM?

внутри обработчика сигнала этот сигнал blocked. либо в parent процессе устанавливайте обработчик с SA_NODEFER, либо пусть child делает sigprocmask(SIG_UNBLOCK)

idle ★★★★★
()

> ...следит за состоянием каждого из них опрашивая по сигналу
>SIGALRM при помощи waitpid каждого потомка.

Вы по таймеру удаляете из системной таблицы pid процесса ? Это так ?
А дочерний процесс по таймеру запускает функцию  'func()'  ?
И у Вас при новом создании процесса не отрабатывает таймер ?

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

А в обработчике сигнала родительского процесса Вы вызываете 
fork() для создания дочернего процесса ?    - Это так ?

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

>А в обработчике сигнала родительского процесса Вы вызываете >fork() для создания дочернего процесса ? - Это так ?

Да .... а разве это запрещено?

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