Как правильно реализовать метод alarm (), чтобы убить все рабочие процессы, созданные fork ()? - PullRequest
1 голос
/ 08 февраля 2010

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

Это правильный способ его реализации?Текущий способ, которым я имею это, это теперь распечатывает сообщение соответствующее сообщение printf () для уничтожаемых рабочих процессов.

Примечание. Я реализовал игнорирование сигналов прерывания, чтобы больше рабочих процессов могло выполняться без беспокойства.

int main(int argc, char** argv)
{
signal(SIGINT, sig_ctrl);
signal(SIGALRM, sig_alarm);

alarm(5); 
sleep(10);

    //rest of program which creates the needed processes

}

void sig_ctrl(int sig)
{
printf("Hold on buddy, you're not terminating this program with CTRL^C.\n");
}

void sig_alarm(int sig)
{
sleep(0);
fflush(stdout);
printf("The alarm is sounding, all worker procceses will be...TERMINATED!");
raise(SIGTERM);
 }

Ответы [ 3 ]

2 голосов
/ 08 февраля 2010

Есть простой путь, который, возможно, небрежный, и трудный.

Простой способ заключается в том, чтобы гарантировать, что начальный процесс является лидером группы процессов, что он игнорирует соответствующий сигнал (но его дочерние элементы не игнорируют сигнал), а затем отправлять сигнал группе процессов.

Более сложный способ требует где-то списка всех дочерних процессов, и тогда родитель может должным образом отправить сигнал каждому из процессов, удалив из списка мертвые.

1 голос
/ 21 февраля 2010

Проблема вашей программы в том, что sleep () обычно реализуется с использованием таймера SIGALRM, поэтому его вызов, вероятно, отменяет настройку сигнала () для SIGALRM

$ человек 3 сна

BUGS
       sleep()  may be implemented using SIGALRM; mixing calls to alarm(2) and
       sleep() is a bad idea.

(Кстати, sleep(0) - это тоже нонсенс. Чего вы пытаетесь достичь с этим?)

0 голосов
/ 08 февраля 2010

У меня была такая же проблема в домашнем задании для юникса. Это в значительной степени решение, которое придумало большинство людей: P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...