Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
10.6. Сигналы POSIX
API POSIX основан на API
sigvec()sigaction()sigvec()sigaction()sigvec()sigaction()10.6.1. Обнажение проблемы
Что неладно с API System V Release 3? В конце концов, они предоставляют блокирование сигналов, так, что сигналы не теряются, и любой данный сигнал может быть надежно обработан.
Ответ в том, что этот API работает лишь с одним сигналом в одно и то же время. Программы обычно обрабатывают больше одного сигнала. И когда вы находитесь в середине процесса обработки одного сигнала, вы не хотите беспокоиться по поводу обработки еще и второго. (Предположим, вы только что начали отвечать по офисному телефону, когда зазвонил ваш мобильный телефон: вы бы предпочли, чтобы телефонная система ответила вызывающему, что в данный момент вы находитесь на другой линии и что скоро освободитесь, вместо того, чтобы проделывать все это самому.)
С API
sigset()sighold()Решением является обеспечение возможности автоматической работы с группами сигналов, т.е. с помощью одного системного вызова. Вы достигаете этого, работая с наборами сигналов и маской сигналов процесса.
10.6.2. Наборы сигналов:
sigset_tМаска сигналов процесса является списком сигналов, которые процесс в настоящее время заблокировал. Сила POSIX API в том, что маской сигналов процесса можно манипулировать атомарно, как единым целым.
Маска сигналов процесса программно представляется с помощью набора сигналов. Это тип
sigset_t/* Непосредственное манипулирование маской сигналов. НЕ ДЕЛАЙТЕ ЭТОГО! */int mask = (1 << SIGHUP) | (1 << SIGINT); /* битовая маска для SIGHUP и SIGINT */Однако, поскольку в системе может быть больше сигналов, чем может содержаться в одной
intlong#include <signal.h> /* POSIX */int sigemptyset(sigset_t *set);int sigfillset(sigset_t *set);int sigaddset(sigset_t *set, int signum);int sigdelset(sigset_t *set, int signum);int sigismember(const sigset_t *set, int signum);Эти функции следующие:
int sigemptyset(sigset_t *set)Освобождает набор сигналов. По возвращении
*setint sigfillset(sigset_t *set)Полностью заполняет набор сигналов. По возвращении
*setint sigaddset(sigset_t *set, int signum)Добавляет
signum*setint sigdelset(sigset_t *set, int signum)Удаляет
signum*setint sigismember(const sigset_t *set, int signum)Возвращает true/false, если
signum*setПеред выполнением с переменной
sigset_tsigemptyset()sigfillset()10.6.3. Управление маской сигналов:
sigprocmask()Маска сигналов процесса вначале пуста - заблокированных сигналов нет. (Это упрощение; см. раздел 10.9 «Сигналы, передающиеся через
fork()exec()#include <signal.h> /* POSIX */int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);int sigpending(sigset_t *set);int sigsuspend(const sigset_t *set);Функции следующие:
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset)Если
oldsetNULL*oldsetsethowSIG_BLOCK *set*setSIG_UNBLOCK *set*set
