Архив документации OpenNet.ru /
Раздел "Программирование в Linux" /
Индекс
Next: Применение сигналов для IPC
Up: Сигналы
Previous: Посылка сигналов с помощью
Contents
В системах Linux концепция сигналов была расширена. Это вызвано следующими
недостатками старого подхода ANSI-C:
- отсутствие возможности опросо актуального статуса сигналов.
- возникновение конфликтов между двумя одинаковыми сигналами, например, SIGINT,
в одной программе. Один обработчик сигнала должен был игнорировать его,
а другой - выполнять определенную функцию, что могло запутать
программу.
В новой концепции сигналов вначале вводится переменная примитивного
типа данных:
-
- 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);
Применяются три режима использования этой функции:
- sigprocmask (mode, NULL, alt_sig_m).
В текущем процессе множество сигналов записывается по адресу
alt_sig_m. mode в этом случае не оказывает эффекта;
- sigprocmask (mode, sig_m, NULL).
Маска сигналов изменяется на новую маску sig_m;
- sigprocmask (mode, sig_m, alt_sig_m).
Сначала актуальная, используемая в текущем процессе маска сигналов
записывается в alt_sig_m, то есть сохраняется. Затем устанавливается
множество сигналов sig_m.
Функция позволяет использовать три предопределенные константы:
- SIG_BLOCK.
Ко множеству сигналов добавляются все установленные в sig_m
сигналы;
- SIG_UNBLOCK.
Сигналы, установленные в sig_m, удаляются;
- SIG_SETMASK.
Устанавливается новая маска сигналов с сигналами, указанными в sig_m.
Если нужно изменить маску сигналов или запретить все сигналы во время
выполнения определенной части кода, применяется функция:
-
- #include <signal.h>
int sigsuspend(const sigset_t *sig_m);
С помощью этой функции можно блокировать процесс до тех пор, пока
не придет нужный сигнал.
2004-06-22
Архив документации на OpenNet.ru