Чтение онлайн

на главную - закладки

Жанры

UNIX: взаимодействие процессов

Стивенс Уильям Ричард

Шрифт:

Функции, которых нет в этом списке, не должны вызываться из обработчика сигнала. Обратите внимание, что в списке отсутствуют стандартные функции библиотеки ввода-вывода и функции pthread_XXX для работы с потоками. Из всех функций IPC, рассматриваемых в этой книге, в список попали только sem_post, read и write (подразумевается, что последние две используются с программными каналами и FIFO).

ПРИМЕЧАНИЕ

Стандарт ANSI С указывает четыре функции, которые могут быть вызваны из обработчика сигналов: abort, exit, longjmp, signal. Первые три отсутствуют в списке функций async-signal-safe стандарта Unix 98. 

Таблица 5.1. Функции, относящиеся к группе async-signal-safe

access fpathconf rename sysconf

aio_return fstat rmdir tcdrain

aio_suspend fsync sem_post tcflow 

alarm getegid setgid tcflush

cfgetispeed geteuid setpgid tcgetattr

cfgetospeed getgid setsid tcgetgrp

cfsetispeed getgroups setuid tcsendbreak

cfsetospeed getpgrp sigaction tcsetattr

chdir getpid sigaddset tcsetpgrp

chmod getppid sigdelset time

chown getuid sigemptyset timer_getoverrun

clock_gettime kill sigfillset timer_gettime

close link sigismember timer_settime

creat lseek signal times

dup mkdir sigpause umask

dup2 mkfifo sigpending uname

execle open sigprocmask unlink

execve pathconf sigqueue utime

_exit pause sigset wait

fcntl pipe sigsuspend waitpid

fdatasync raise sleep write

fork read stat

Пример: уведомление сигналом

Одним из способов исключения вызова каких-либо функций из обработчика сигнала является установка этим обработчиком глобального флага, который проверяется программным потоком для получения информации о приходе сообщения. В листинге 5.9 иллюстрируется этот метод, хотя новая программа также содержит ошибку, но уже другую, о которой мы вскоре поговорим подробнее.

Глобальная переменная

2 Поскольку единственное действие, выполняемое обработчиком сигнала, заключается в присваивании ненулевого значения флагу mqflag, глобальным переменным из листинга 5.8 уже не нужно являться таковыми. Уменьшение количества глобальных переменных — это всегда благо, особенно при использовании программных потоков.

Открытие очереди сообщений

15-18 Мы открываем очередь сообщений, получаем ее атрибуты и выделяем буфер считывания.

Инициализация наборов сигналов

19-22 Мы инициализируем три набора сигналов и устанавливаем бит для сигнала SIGUSR1 в наборе newmask.

Установка обработчика сигнала, включение уведомления

23-27 Мы устанавливаем обработчик сигнала для SIGUSR1, присваиваем значения полям структуры sigevent и вызываем mq_notify. 

Листинг 5.9. Обработчик сигнала устанавливает флаг для главного потока (неправильная версия)

//pxmsg/mqnotifysig2.c

1 #include "unpipc.h"

2 volatile sig_atomic_t mqflag; /* ненулевое значение устанавливается обработчиком */

3 static void sig_usrl(int);

4 int

5 main(int argc, char **argv)

6 {

7 mqd_t mqd;

8 void *buff;

9 ssize_t n;

10 sigset_t zeromask, newmask, oldmask;

11 struct mq_attr attr;

12 struct sigevent sigev;

13 if (argc != 2)

14 err_quit("usage: mqnotifysig2 <name>");

15 /* открытие очереди, получение атрибутов, выделение буфера */

16 mqd = Mq_open(argv[1], O_RDONLY);

17 Mq_getattr(mqd, &attr);

18 buff = Malloc(attr.mq_msgsize);

19 Sigemptyset(&zeromask); /* сигналы не блокируются */

20 Sigemptyset(&newmask);

21 Sigemptyset(&oldmask);

22 Sigaddset(&newmask, SIGUSR1);

23 /* установка обработчика, включение уведомления */

24 Signal(SIGUSR1, sig_usr1);

25 sigev.sigev_notify = SIGEV_SIGNAL;

26 sigev.sigev_signo = SIGUSR1;

27 Mq_notify(mqd, &sigev);

28 for (;;) {

29 Sigprocmask(SIG_BLOCK, &newmask, &oldmask); /* блокируем SIGUSR1 */

30 while (mqflag == 0)

31 sigsuspend(&zeromask);

32 mqflag = 0; /* сброс флага */

33 Mq_notify(mqd, &sigev); /* перерегистрируемся */

34 n = Mq_receive(mqd, buff, attr.mq_msgsize, NULL);

35 printf("read %ld bytes\n", (long) n);

Поделиться:
Популярные книги

Убивая маску

Метельский Николай Александрович
13. Унесенный ветром
Фантастика:
боевая фантастика
5.75
рейтинг книги
Убивая маску

Бастард Императора. Том 15

Орлов Андрей Юрьевич
15. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 15

Грозовой замок

Мазуров Дмитрий
7. Громовая поступь
Фантастика:
фэнтези
героическая фантастика
рпг
5.00
рейтинг книги
Грозовой замок

Черный Маг Императора 7 (CИ)

Герда Александр
7. Черный маг императора
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 7 (CИ)

На границе империй. Том 10. Часть 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 3

Тринадцатый VIII

NikL
8. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VIII

Кодекс Охотника. Книга VIII

Винокуров Юрий
8. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VIII

Чужак из ниоткуда

Евтушенко Алексей Анатольевич
1. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда

Вперед в прошлое 5

Ратманов Денис
5. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 5

Крепость над бездной

Лисина Александра
4. Гибрид
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Крепость над бездной

Сердце Дракона. Том 8

Клеванский Кирилл Сергеевич
8. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.53
рейтинг книги
Сердце Дракона. Том 8

Мажор. Дилогия.

Соколов Вячеслав Иванович
Фантастика:
боевая фантастика
8.05
рейтинг книги
Мажор. Дилогия.

Двойник Короля

Скабер Артемий
1. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля

Мы друг друга не выбирали

Кистяева Марина
1. Мы выбираем...
Любовные романы:
остросюжетные любовные романы
прочие любовные романы
современные любовные романы
5.00
рейтинг книги
Мы друг друга не выбирали