Межпроцессное взаимодействие с сигналами в C - почему он не работает? - PullRequest
0 голосов
/ 31 октября 2011

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

signal(1, SigControllerCarWaiting1);
signal(2, SigControllerCarWaiting2);
signal(3, SigControllerCarWaiting3);
signal(4, SigControllerCarWaiting4);
signal(5, SigControllerCarWaiting5);

signal(6, SigControllerCarEnter1);
signal(7, SigControllerCarEnter2);
signal(8, SigControllerCarEnter3);
signal(9, SigControllerCarEnter4);
signal(10, SigControllerCarEnter5);

И это в основном работает.Когда я запускаю свою программу, много раз она завершается, как и ожидалось.Но в некоторых случаях он не сможет переопределить поведение по умолчанию, и мой родительский процесс выведет что-то вроде «Зависание», а затем прекратит работу, оставив группу детей все еще выполняющейся.

Я пыталсявосстановление сигнала в обработчике, как ...

void SigControllerCarWaiting5() { signal(5, SigControllerCarWaiting5); SigControllerCarWaiting(4); }
void SigControllerCarWaiting4() { signal(4, SigControllerCarWaiting4); SigControllerCarWaiting(3); }
void SigControllerCarWaiting3() { signal(3, SigControllerCarWaiting3); SigControllerCarWaiting(2); }
void SigControllerCarWaiting2() { signal(2, SigControllerCarWaiting2); SigControllerCarWaiting(1); }
void SigControllerCarWaiting1() { signal(1, SigControllerCarWaiting1); SigControllerCarWaiting(0); }

Но это, похоже, не оказывает влияния.Иногда это отлично работает;в других случаях произойдет сбой с сигнальным текстом и будет убит родитель.Я очень новичок во всем этом и думал, что кто-то может направить меня в правильном направлении.Есть ли что-то кроме 'сигнала (ID, функции), который я должен использовать для захвата нескольких входящих сигналов?

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

РЕДАКТИРОВАТЬ

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

1 Ответ

1 голос
/ 31 октября 2011

Живи и учись ...

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

Изменение на sigaction предотвращает это. Тем не менее, он все еще «отказывал» на определенных сигналах (в частности, 9 или SIGKILL, потому что система не позволит вам переопределить поведение SIGKILL).

Итак, мое решение состоит в том, чтобы использовать sigaction и , а не использовать SIGKILL для собственного пользовательского общения.

Помимо этого; похоже, что, как и предполагали другие, в этой ситуации лучше использовать каналы или семафоры.

...