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 в ваш процесс.

  1. настроить обработчик сигнала
  2. используйте 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 г.