Например, если я использую kill (функцию в сигнале библиотеки C) для отправки сигнала SIGINT дочернему элементу, будет ли сигнал SIGCHLD от дочернего элемента перехвачен до возврата из функции kill?
Убийство будет прервано сигналом?
Ответы (3)
Хотя системный вызов kill
нельзя прервать (по крайней мере, согласно справочной странице), есть по крайней мере два случая, когда обработчик SIGCHLD
может быть запущен до возврата функции:
- Если в вашем процессе есть еще один поток, ядро может выбрать запуск обработчика сигнала еще до того, как системный вызов
kill
вернется в ваш первый поток. - Вероятно, вы используете функцию-оболочку для
kill
из вашей библиотеки libc. Обработчик сигнала может работать между возвратом системного вызова к нему и возвратом к вашему коду.
Поэтому, если вы хотите убедиться, что вы не получите SIGCHLD
до тех пор, пока не вернется kill
, вам нужно использовать sigprocmask
, чтобы заблокировать его до kill
, пока вы не будете к этому готовы.
sigprocmask
, пока вы не будете готовы к этому.
- person Joseph Sible-Reinstate Monica; 03.05.2020
kill
, не будет прерван сигналом, пока он все еще находится в режиме ядра.
- person Joseph Sible-Reinstate Monica; 06.05.2020
Обработка сигналов является асинхронной. Поэтому в любом случае нет никакой гарантии, что SIGCHLD
, испущенный при завершении дочернего процесса, будет получен родителем до возврата вызова kill
. Я предполагаю, что kill
обычно выигрывает гонку и возвращается до прибытия SIGCHLD
, но полагаться на это небезопасно.
Я не знаю, отвечает ли это на ваш вопрос, но, читая справочную страницу Linux, возможные возвращаемые значения kill
: EINVAL
, EPERM
и ESRCH
. EINTR
не один из них. Это заставляет меня думать, что функция не будет прервана. По крайней мере, системный вызов не будет прерван.
РЕДАКТИРОВАТЬ: я имею в виду errno
, а не возврат, значения.