Вызывать из обработчика сигнала все функции, например, printf
main и выводить сообщение, если нужно. В конце этой главы вы найдете список вызовов, которые можно безопасно применять в теле обработчиков сигналов.Как это работает
Программа устроена так, что, когда вы задаете сигнал SIGINT
ouchouch завершится, программа продолжает выполняться, но восстанавливает реакцию на сигнал, принятую по умолчанию. (У разных версий UNIX, в особенности у потомков системы Berkeley UNIX, в течение многих лет сложилось разное поведение при получении сигналов. Если вы хотите восстановить поведение по умолчанию после возникновения сигнала, лучше всего запрограммировать его на конкретные действия.) Когда программа получает второй сигнал SIGINT, она выполняет стандартное действие, приводящее к завершению программы.Если вы хотите сохранить обработчик сигнала и продолжать реагировать на комбинацию клавиш signal
Мы не рекомендуем вам пользоваться функцией signal
sigaction, более четко определенный и надежный интерфейс, который следует применять в новых программах.Функция signal
SIG_ERR с установкой положительного значения в переменной errno. Если задан неверный сигнал или делается попытка обработать сигнал, который не может быть перехвачен или игнорироваться, например SIGKILL, переменной errno присваивается значение EINVAL.Отправка сигналов
Процесс может отправить сигнал другому процессу, включая себя самого, с помощью вызова функции kill
#include
#include
int kill(pid_t pid, int sig);
Функция kill
sig процессу с идентификатором, заданным в аргументе pid. В случае успеха она возвращает 0. Для отправки сигнала посылающий процесс должен иметь право на выполнение этого действия. Обычно это означает, что у обоих процессов должен быть один и тот же идентификатор пользователя ID (т.е. вы можете отправить сигнал только одному из собственных процессов, хотя суперпользователь может отправлять сигналы любому процессу).Функция kill
errno, если задан неверный сигнал, (errno равна EINVAL), у процесса нет полномочий (EPERM) или заданный процесс не существует (ESRCH).