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

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

Жанры

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);

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

Газлайтер. Том 40

Володин Григорий Григорьевич
40. История Телепата
Фантастика:
альтернативная история
аниме
попаданцы
5.00
рейтинг книги
Газлайтер. Том 40

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

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Дважды одаренный. Том IV

Тарс Элиан
4. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
7.00
рейтинг книги
Дважды одаренный. Том IV

Точка Бифуркации

Смит Дейлор
1. ТБ
Фантастика:
боевая фантастика
7.33
рейтинг книги
Точка Бифуркации

Студент из прошлого тысячелетия

Еслер Андрей
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Студент из прошлого тысячелетия

Иной. Том 1. Школа на краю пустыни

Amazerak
1. Иной в голове
Фантастика:
боевая фантастика
рпг
аниме
5.75
рейтинг книги
Иной. Том 1. Школа на краю пустыни

Белые погоны

Лисина Александра
3. Гибрид
Фантастика:
фэнтези
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Белые погоны

Черный Маг Императора 15

Герда Александр
15. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
фантастика: прочее
5.00
рейтинг книги
Черный Маг Императора 15

"Дальние горизонты. Дух". Компиляция. Книги 1-25

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

Ожерелье Странника

Хаггард Генри Райдер
Приключения:
исторические приключения
7.50
рейтинг книги
Ожерелье Странника

Агенты ВКС

Вайс Александр
3. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Агенты ВКС

Воронцов. Перезагрузка. Книга 2

Тарасов Ник
2. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Воронцов. Перезагрузка. Книга 2

Роза ветров

Кас Маркус
6. Артефактор
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Роза ветров

Путь

Yagger Егор
Фантастика:
космическая фантастика
4.25
рейтинг книги
Путь