Межпроцессная синхронизация с использованием сигналов в c, linux - PullRequest
3 голосов
/ 01 июня 2011

Процесс Вилки говорят 4 дочерних процесса. exec () используется для замены кода дочерних элементов. Дети инициализируются и должны ждать, пока родитель создаст все 4 из них.

Затем родительский элемент отправляет sigusr1 каждому дочернему процессу, чтобы он мог начать обработку. Родитель ждет, пока все дети завершат обработку. Когда ребенок заканчивает свою работу, он отправляет sigusr2 родителю. Когда родитель получает все сигналы sigusr2, он продолжает выполнение, объединяя вычисления дочерних процессов.

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

Я бы хотел достичь 100%. В другом случае pause () и цикл будет работать?

Ответы [ 4 ]

4 голосов
/ 01 июня 2011

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

Если вы решите использовать sigaction() вы сможете перехватить все сигналы, отправленные вашему процессу.

1 голос
/ 03 июня 2011

Другие авторы уже рассказали, как избежать потери сигналов - при этом я бы рекомендовал вообще не использовать сигналы.Поскольку сигналы могут взламываться в любой точке (даже при удержании блокировок!), Очень сложно написать более безопасный для сигнала код, чем, скажем, записать флаг в fifo или увеличить значение eventfd.почему бы просто не использовать pipe или eventfd , чтобы сообщить о завершении?Это не только гарантирует, что все написанные сообщения попадут в родительский процесс, но также позволяет избежать проблем с синхронизацией, позволяя вашему процессу получать данные из канала / eventfd только тогда, когда он будет готов.

1 голос
/ 03 июня 2011

Вы должны использовать sigaction(); однако опять вы можете потерять некоторые из них, потому что:

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

Лучший способ - использовать сигналы в реальном времени, используя sigqueue().

0 голосов
/ 29 сентября 2014

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

...