Как синхронизировать несколько процессов в c через базовую обработку сигналов - PullRequest
1 голос
/ 04 мая 2010

человек. Для академического упражнения я должен реализовать программу на c для платформы nix, которая должна синхронизировать несколько процессов посредством обработки сигналов, используя только основные функции сигнала, паузы, уничтожения и разветвления. Я искал в Google и не нашел четкого примера: надеюсь, мудрость одного из вас осветит мой путь. Спасибо!

Ответы [ 2 ]

2 голосов
/ 05 мая 2010

pause не возвращается, пока не получен сигнал. Базовый дизайн, таким образом:

  • fork для создания необходимых рабочих
  • поймать SIGINT в каждом работнике. Обработчик устанавливает флаг, означающий, что процесс должен завершиться после завершения текущего задания.
  • каждый процесс работает, пока может, затем pause с. Повторять, если не получено SIGINT (проверка до и после pause).
  • когда у одного процесса есть работа для другого процесса, он сигнализирует другому процессу с помощью SIGCONT
  • когда для процесса больше нет работы, подайте сигнал SIGINT.

Это не совсем синхронизированный доступ к общим данным. Для этого вы можете добавить дополнительное правило:

  • когда процесс сообщает другому, что работа доступна, он должен pause

Конечно, это скорее противоречит цели параллельного программирования.

Поскольку большинство системных вызовов прерываются сигналами (в результате чего они возвращают -1, а для errno установлено значение EINTR), вам придется обрабатывать эту непредвиденную ситуацию, повторяя каждый затронутый системный вызов, пока он не будет успешным. Например:

while ((readCount = read(...)) < 0 && errno == EINTR) {}
2 голосов
/ 04 мая 2010

Важно помнить, что Linux (по крайней мере, и, возможно, многие другие Unices) могут объединять несколько сигналов одного типа в один экземпляр . Поэтому, если вы отправите процессу один сигнал со значением x , этот процесс гарантированно получит его; но если вы отправите 2 или более сигналов со значением x , процесс гарантированно получит только один из этих сигналов.

Кроме того, сигналы не гарантируются в том порядке, в котором они отправляются .

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

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

Вывод: не использовать сигналы для МПК.

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