Предотвратить прерывание SIGALRM waitpid()

Я пытаюсь сделать свой процесс waitpid() для дочернего процесса, а также печатать что-то каждый интервал времени.

Мой текущий план состоит в том, чтобы запланировать itimer, waitpid(), обработать печать SIGALRM и остановить таймер, когда waitpid() закончится.

Единственная часть, которую я не могу понять, это предотвращение прерывания SIGALRM waitpid().

Я просмотрел справочные страницы и не вижу никаких флагов для этого.

Мысли?


person Matt Goodrich    schedule 02.05.2016    source источник


Ответы (2)


Если waitpid() вернул -1, а errno равно EINTR, просто начните сначала вызывать waitpid() .

pid_t pid;

while (((pid_t) -1) == (pid = waitpid(...)))
{
  if (EINTR == errno)
  {
    continue;
  }

  ...
}

В качестве альтернативы (по крайней мере, для Linux) возврата waitpid() при приеме сигнала можно избежать с помощью флага SA_RESTART, установленного при установке обработчиков сигналов. Подробнее об этом см. здесь: http://man7.org/linux/man-pages/man7/signal.7.html

person alk    schedule 02.05.2016

Либо вам нужно замаскировать сигнал перед вызовом waitpid(), но тогда ваша тревога будет отложена до тех пор, пока не будет разблокирована, либо вам нужно проверить возвращаемое значение waitpid() и errno для EINTR

person Stian Skjelstad    schedule 02.05.2016