Сигнализировать все процессы в группе процессов, кроме себя - PullRequest
0 голосов
/ 13 мая 2018

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

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

Чтобы приостановить все процессы в группе, я первоначально использовал вызов:

killpg(0, SIGSTOP);

и намеревался возобновить их после:

killpg(0, SIGCONT);

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

1 Ответ

0 голосов
/ 14 мая 2018

Вы не можете отправить сигнал всем членам группы, кроме отправителя, но существует разумный обходной путь. Вместо использования SIGSTOP (который не может быть обработан или проигнорирован), вы можете использовать SIGTSTP, который по умолчанию будет иметь тот же эффект, что и SIGSTOP, останавливая процесс, который его получает. Чтобы избежать остановки отправителя, просто сделайте так, чтобы отправитель проигнорировал сигнал перед его отправкой, а затем восстановите расположение сигнала по умолчанию после отправки сигнала группе процессов.

...