Может ли программа вернуться / завершиться до вызова функции kill? - PullRequest
0 голосов
/ 11 февраля 2019

Я немного озадачен тем, как работает функция kill (pid, signal) - я считаю, что она асинхронная, поэтому сигнал может не прийти, пока не будет выполнено еще несколько инструкций.Мой вопрос: если вы вызываете kill (pid, signal), а затем возвращаетесь в следующей строке (как показано ниже), гарантируете ли вы, что сигнал будет перехвачен и обработан до завершения программы, или можно выйти без обработки?сигнал, если мы запустим «return 0» до завершения функции kill?

kill(pid, SIGUSR1);
return 0;

1 Ответ

0 голосов
/ 11 февраля 2019

Если процесс отправляет сигнал только самому себе, и этот сигнал не блокируется, и нет других ожидающих сигналов для этого процесса, тогда сигнал будет отправлен синхронно (то есть до того, как kill() вернется).

Этого недостаточно для гарантии 100% надежности, поэтому вы можете предпочесть не полагаться на него.Например, может случиться другой процесс, который отправит другой сигнал в одно и то же время;это, вероятно, вне вашего контроля.

Если процесс отправляет сигнал другому процессу, нет гарантии, что он будет получен до того, как kill() вернется.Но он будет отправлен, даже если функция сигнализации завершится.

Если сигнал будет получен более чем одним процессом, kill может вернуться после отправки первого сигнала, что не гарантируется как процесс сигнализации.Опять же, это может привести к возврату процесса до получения сигнала.Некоторые платформы могут предлагать дополнительные гарантии.

Вот спецификация Posix :

Если значение pid вызывает генерацию sig для отправкипроцесс, и если sig не заблокирован для вызывающего потока и если ни один другой поток не разблокировал sig или не ожидает в функции sigwait() для sig, либо sig, либо хотя бы один ожидающий разблокированный сигнал долженбыть доставленным в поток отправителя до того, как kill() вернется.

...