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

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

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

25:

26: *((int *)NULL) = 1 ;

27:

28: return 0;

29: }

12.7.2. Отправка данных с сигналом

Механизм

siginfo_t
также позволяет сигналам, которые посылают программы, присоединять к себе один элемент данных (этот элемент может быть указателем, что позволяет неявно передавать любой необходимый объем данных). Чтобы отправить данные, используется
union sigval
.

#include <signal.h>

union sigval {

 int sival_int;

 void *sival_ptr;

};

Любой

из членов объединения —
sival_int
или
sival_ptr
— может быть установлен в требуемое значение, которое включается в
siginfo_t
, доставляемое вместе с сигналом. Чтобы сгенерировать сигнал с
union sigval
, должна использоваться функция
sigqueue
.

#include <signal.h>

void *sigqueue(pid_t pid, int signum, const union sigval value);

В отличие от

kill
,
pid
должен быть корректным идентификатором процесса (отрицательные значения не допускаются),
signum
указывает номер посылаемого сигнала. Подобно
kill
,
sigqueue
допускает нулевое значение
signum
нулю, чтобы проверить, позволяет ли вызывающий процесс посылать целевому сигналы, в действительности не выполняя такой посылки. Последний параметр,
value
, представляет собой элемент данных, передаваемый вместе с сигналом.

Чтобы принять

union sigval
, процесс, перехватывающий сигнал, должен использовать
SA_SIGINFO
при регистрации обработчика сигналов с помощью
sigaction
. Когда член
si_code
структуры
siginfo_t
равен
SI_QUEUE
, то
siginfo_t
представляет член
si_value
, который содержит значение
value
, переданное
sigqueue
.

Ниже приведен пример отправки элемента данных с сигналом. Он устанавливает в очередь три сигнала

SIGRTMIN
с разными элементами данных. Он демонстрирует, что сигналы доставляются в том же порядке, что были отправлены, как мы и ожидаем при работе с сигналами реального времени [73] . Более сложный пример, использующий сигналы для отслеживания изменений в каталогах, можно найти в главе 14.

73

Дополнительные примеры обработки сигналов вы можете найти в программах для аренды файлов (глава 13), управления терминалом (глава 16) и работы с интервальными таймерами (глава 18).

 1: /* sigval.с */

 2:

 3: #include <sys/signal.h>

 4: #include <stdlib.h>

 5: #include <stdio.h>

 6: #include <string.h>

 7: #include <unistd.h>

 8:

 9: /* Захватить сигнал и зарегистрировать факт его обработки */

10: void handler(int signo, siginfo_t *si, void *context) {

11: printf("%d\n", si->si_value.sival_int);

12: }

13:

14: int main {

15: sigset_t mask;

16: sigset_t oldMask;

17: struct sigaction act;

18: int me = getpid;

19: union sigval val;

20:

21: /*
Отправить сигналы handler и сохранять все сигналы заблокированными,

22: чтобы handler был сконфигурирован для перехвата с исключением

23: состязаний при манипулировании глобальными переменными */

24: act.sa_sigaction = handler;

25: act.sa_mask = mask;

26: act.sa_flags = SA_SIGINFO;

27:

28: sigaction(SIGRTMIN, &act, NULL);

29:

30: /* Блокировать SIGRTMIN, чтобы можно было увидеть очередь и упорядочение*/

31: sigemptyset(&mask);

32: sigaddset(&mask, SIGRTMIN);

33:

34: sigprocmask(SIG_BLOCK, &mask, &oldMask);

35:

36: /* Сгенерировать сигналы */

37: val.sival_int = 1;

38: sigqueue(me, SIGRTMIN, val);

39: val.sival_int++;

40: sigqueue(me, SIGRTMIN, val);

41: val.sival_int++;

42: sigqueue(me, SIGRTMIN, val);

43:

44: /* Разрешить доставку сигналов */

45: sigprocmask(SIG_SETMASK, &oldMask, NULL);

46:

47: return 0;

48: }

Глава 13

Расширенная обработка файлов

В Linux файлы применяются при решении большого количества задач, среди которых, например, хранение долговременных данных, организация сетей с помощью сокетов и доступ к устройствам посредством файлов устройств. Разнообразие приложений, работающих с файлами, привело к созданию множества специальных способов управления файлами. В главе 11 рассматривались наиболее распространенные действия с файлами; в настоящей же главе исследуются специализированные файловые операции. В частности, мы рассмотрим следующие вопросы: использование одновременно нескольких файлов, отображение файлов на системную память, блокировка файлов, чтение и запись вразброс.

13.1. Мультиплексирование входных и выходных данных

Многим клиент-серверным приложениям необходимо считывать входные данные или записывать выходные данные с помощью одновременно нескольких файловых дескрипторов. Например, современные Web-браузеры открывают одновременно несколько сетевых подключений, чтобы уменьшить время загрузки Web-страницы. Это позволяет им загружать множество изображений, имеющихся на большинстве Web-страниц, быстрее, чем с помощью последовательных подключений. Кроме канала межпроцессных взаимодействий (IPC), используемого графическими браузерами для связи с X-сервером, на котором они отображаются, браузеры работают с множеством файловых дескрипторов.

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

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

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

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

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.00
рейтинг книги
Ермак. Телохранитель

Матабар IV

Клеванский Кирилл Сергеевич
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар IV

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Свет Черной Звезды

Звездная Елена
6. Катриона
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Свет Черной Звезды

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Идеальный мир для Лекаря 22

Сапфир Олег
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 22

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

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

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

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад