pause () и sigsuspend () при использовании в межпроцессном взаимодействии - PullRequest
1 голос
/ 28 июня 2011

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

WAIT_CHILD(){
  while(sigflag == 0){ //sigflag will be set to 1 in a signal handler in the child process
    sigsuspend(&zeromask); //No signal is in the mask set
  }

  //do sth....
}

Мой вопрос: можем ли мы использовать pause() для замены sigsuspend(&zeromask)?

1 Ответ

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

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

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

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