next up previous contents
Next: Применение сигналов для IPC Up: Сигналы Previous: Посылка сигналов с помощью   Contents

Работа с сигналами в Linux

В системах Linux концепция сигналов была расширена. Это вызвано следующими недостатками старого подхода ANSI-C:

В новой концепции сигналов вначале вводится переменная примитивного типа данных:
sigset_t signal_set;
Множество сигналов инициализируется функцией sigemptyset():
#include <signal.h>

int sigemptyset(sigset_t *sig_m);

Теперь можно добавлять новые сигналы для конкретного процесса с помощью функции:

#include <signal.h>

int sigaddset(sigset_t *sig_m, int signr);

где signr являются номерами сигналов, которые добавляются во множество. Также можно использовать символическое имя, например:

sigaddset(&signal_set, SIGINT);
С помощью функции

#include <signal.h>

int sigdelset(setsig_t *sig_m, int signr);

сигнал signr удаляется из множества сигналов sig_m. Чтобы проверить, имеется ли некоторый сигнал во множестве, можно использовать следующую функцию:

#include <signal.h>

int sigismember(sigset_t sig_m,int signr);

Если сигнал присутствует во множестве, функция возвращает 1, иначе 0.

Существует функция для сохранения или изменения маски сигналов:

#include <signal.h>

int sigprocmask(int mode, const sigset_t *sig_m,

               sigset_t *alt_sig_m);

Применяются три режима использования этой функции:

  1. sigprocmask (mode, NULL, alt_sig_m). В текущем процессе множество сигналов записывается по адресу alt_sig_m. mode в этом случае не оказывает эффекта;
  2. sigprocmask (mode, sig_m, NULL). Маска сигналов изменяется на новую маску sig_m;
  3. sigprocmask (mode, sig_m, alt_sig_m). Сначала актуальная, используемая в текущем процессе маска сигналов записывается в alt_sig_m, то есть сохраняется. Затем устанавливается множество сигналов sig_m.
Функция позволяет использовать три предопределенные константы:

Если нужно изменить маску сигналов или запретить все сигналы во время выполнения определенной части кода, применяется функция:

#include <signal.h>

int sigsuspend(const sigset_t *sig_m);

С помощью этой функции можно блокировать процесс до тех пор, пока не придет нужный сигнал.



2004-06-22