Signal — это механизм IPC в UNIX. Вы также можете использовать сигналы вызова как ловушки (программные прерывания).
Использование сигналов может привести к асинхронному событию (уведомлению).
В пользовательском пространстве
Во-первых, нам нужно настроить набор сигналов. Вы можете найти номер сигнала (signum, например, SIGHUP, SIGINT…) в signal.h
.
Мы используем некоторую функцию настройки для настройки набора сигналов (sigset) следующим образом.
Во-вторых, мы можем использовать sigaction(2) для настройки обработчика сигналов. Он сообщит ядру, какие сигналы хочет перехватить обработчик.
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
И обработчик помещается в struct sigaction
, например. sigaction.sa_handler = signal_handler
.
После регистрации набора сигналов мы можем использовать kill(2) или raise(3) для отправки сигнала процессу.
Или вы можете использовать alarm(3) для установки таймера.< br /> И тогда сигнал будет срабатывать и выполнять обработчик сигнала.
Примечание. Обработчик сигнала должен использовать реентерабельные функции. вы можете сослаться на бинарные хаки или тему, связанную с APUE.
Обработчик сигнала может выполнять некоторые задачи:
- Игнорируйте установленный вами набор сигналов, кроме SIGKILL и SIGSTOP.
- Ручка и делать то, что вам нужно
- Выполнить действие по умолчанию
Наконец, мы можем настроить файл для отправки SIGIO в ваш процесс.
- настроить обработчик сигнала
- используйте fcntl(2)
например.
Примечание. Если вы устанавливаете более одного файла, вы просто используете выбор или опрос, чтобы узнать, какой файл его отправляет.
В пространстве ядра
Ядро использует send_sig_info()
для отправки сигнала процессу.
int send_sig_info(int sig, struct siginfo *info, struct task_struct *p);
Ядро поддерживает некоторые функции для настройки следующим образом.
fasync_helpr
включен в file.afasync(). И kill_fasync
можно включить в любые функции, о которых вы хотите уведомлять.
Ссылка :
Стивенс, В. Ричард и Стивен А. Раго. Расширенное программирование в среде UNIX. Addison-Wesley, 2013.
Корбет, Джонатан, Алессандро Рубини и Грег Кроа-Хартман. Драйверы устройств Linux: где ядро встречается с оборудованием. "O'Reilly Media, Inc.", 2005 г.