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

на главную

Жанры

QNX/UNIX: Анатомия параллелизма
Шрифт:

9. Согласно POSIX сигналы, обработчики для которых также устанавливаются с флагом

SA_SIGINFO
, но не входящие в диапазон сигналов реального времени, например стандартные сигналы UNIX, могут обрабатываться как на основе помещения их в очередь, так и без ее использования; выбор оставляется на усмотрение разработчика ОС.

Мы перечислили основные требования POSIX к модели обработки сигналов реального времени. Дополнения, отличия и специфические структуры данных QNX будут рассмотрены немного позже.

Весьма доходчивый пример для проверки и иллюстрации обработки

сигналов реального времени приведен У. Стивенсом [2]. Мы же построим приложение, реализующее его основную идею: [33]

Приоритеты сигналов реального времени

#include <stdlib.h>

#include <stdio.h>

#include <iostream.h>

#include <signal.h>

#include <unistd.h>

33

Повторить приложение У. Стивенса в QNX в чистом виде не удастся — оно аварийно завершится по сигналу. Тонкий анализ этого факта интересен сам по себе, но он выходит за рамки нашего рассмотрения. Мы обращаем внимание на это обстоятельство, чтобы лишний раз сделать акцент на достаточно ощутимых отличиях реализаций QNX от схем POSIX (или того, как эти схемы понимаются в других ОС).

static void handler(int signo, siginfo_t* info, void* context) {

cout << "received signal " << signo << " code = " << info->si_code <<

" val = " << info->si_value.sival_int << endl;

}

int main(int argc, char *argv[]) {

cout << "signal SIGRTMIN=" << (int)SIGRTMIN

<< " - signal SIGRTMAX=" << (int)SIGRTMAX << endl;

int opt, val, beg = SIGRTMAX, num = 3,

fin = SIGRTMAX - num, seq = 3;

// обработка параметров запуска:

while ((opt = getopt(argc, argv, "b:e n")) != -1) {

switch(opt) {

case 'b': // начальный сигнал серии

if (sscanf(optarg, "%i", &val) != 1)

perror("parse command line failed"), exit(EXIT_FAILURE);

beg = val;

break;

case 'e': // конечный сигнал серии

if (sscanf(optarg, "%i", &val) != 1)

perror("parse command line failed"), exit(EXIT_FAILURE);

fin = val;

break;

case 'n': // количество сигналов в группе посылки

if (sscanf(optarg, "%i", &val) != 1)

perror("parse command line failed"), exit(EXIT_FAILURE);

seq = val;

break;

default:

exit(EXIT_FAILURE);

}

}

num = fin - beg;

fin += num > 0 ? 1 : -1;

sigset_t sigset;

sigemptyset(&sigset);

for (int i = beg; i != fin; i += (num > 0 ? 1 : -1))

sigaddset(&sigset, i);

pid_t pid;

// вот здесь ветвление на 2 процесса

if (pid - fork == 0) {

// дочерний процесс, здесь будут приниматься посланные сигналы

sigprocmask(SIG_BLOCK, &sigset, NULL);

for (int i = beg; i != fin; i += (num > 0 ? 1 : -1)) {

struct sigaction act, oact;

sigemptyset(&act.sa_mask);

act.sa_sigaction = handler;

// вот оно - реальное время!

act.sa_flags = SA_SIGINFO;

if (sigaction(i, &act, NULL) < 0) perror("set signal handler: ");

}

cout << "CHILD: signal mask set" << endl;

sleep(3); // пауза для посылки сигналов родителем

cout << "CHILD: signal unblock" << endl;

sigprocmask(SIG_UNBLOCK, &sigset, NULL);

sleep(3); // пауза для приема всех сигналов

exit(EXIT_SUCCESS);

}

// родительский процесс: отсюда будут посылаться сигналы

sigprocmask(SIG_BLOCK, &sigset, NULL);

// пауза для установки обработчиков дочерним процессом

sleep(1);

union sigval value;

for (int i = beg, i != fin; i += (num > 0 ? 1 : -1)) {

for (int j = 0; j < seq; j++) {

value.sival_int = j;

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

Попала, или Кто кого

Юнина Наталья
Любовные романы:
современные любовные романы
5.88
рейтинг книги
Попала, или Кто кого

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

Жребий некроманта 2

Решетов Евгений Валерьевич
2. Жребий некроманта
Фантастика:
боевая фантастика
6.87
рейтинг книги
Жребий некроманта 2

Энфис 3

Кронос Александр
3. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 3

Корсар

Русич Антон
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
6.29
рейтинг книги
Корсар

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

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

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

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

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Лорд Системы 12

Токсик Саша
12. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 12

Приручитель женщин-монстров. Том 3

Дорничев Дмитрий
3. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 3

Попытка возврата. Тетралогия

Конюшевский Владислав Николаевич
Попытка возврата
Фантастика:
альтернативная история
9.26
рейтинг книги
Попытка возврата. Тетралогия

Последний Паладин. Том 4

Саваровский Роман
4. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 4

Возвышение Меркурия

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

Играть, чтобы жить. Книга 1. Срыв

Рус Дмитрий
1. Играть, чтобы жить
Фантастика:
фэнтези
киберпанк
рпг
попаданцы
9.31
рейтинг книги
Играть, чтобы жить. Книга 1. Срыв