Будет ли убийство прервано сигналом? - PullRequest
2 голосов
/ 03 мая 2020

Например, если я использую kill (функция из C библиотеки signal.h) для передачи сигнала SIGINT дочернему элементу, будет ли сигнал SIGCHLD от дочернего элемента отлавливаться до того, как функция kill вернется?

Ответы [ 3 ]

4 голосов
/ 03 мая 2020

Хотя системный вызов kill не прерывается (по крайней мере, в соответствии с справочной страницей ), есть еще как минимум два случая, в которых обработчик SIGCHLD мог бы выполняться до возврата функции:

  1. Если в вашем процессе есть другой поток, ядро ​​может выбрать запуск там обработчика сигнала даже до того, как системный вызов kill вернется в ваш первый поток.
  2. Вы, вероятно, используете функция-обёртка для kill из вашей библиотеки c. Обработчик сигнала может работать между системным вызовом, возвращающимся к нему, и возвращаться к вашему коду.

Так что если вы хотите убедиться, что вы не получите SIGCHLD до тех пор, пока kill возвращается, затем вам нужно использовать sigprocmask, чтобы заблокировать его до kill, пока вы не будете готовы к этому.

2 голосов
/ 03 мая 2020

Обработка сигналов асинхронная. Таким образом, нет никакой гарантии, будет ли SIGCHLD, отправленный после завершения дочернего процесса, получен родителем до возврата вызова kill. Я предполагаю, что kill будет обычно выигрывает гонку и возвращается до прибытия SIGCHLD, но полагаться на это небезопасно.

2 голосов
/ 03 мая 2020

Я не знаю, отвечает ли это на ваш вопрос, но, читая справочную страницу Linux, возможные значения возврата kill равны EINVAL, EPERM и ESRCH. EINTR не является одним из них. Это заставляет меня думать, что функция не будет прервана. По крайней мере, системный вызов не будет прерван.

РЕДАКТИРОВАТЬ: я имею в виду errno, не возвращать значения.

...