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

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

Жанры

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;

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

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

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

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

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

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

Аргумент барона Бронина 4

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

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Измена. Право на обман

Арская Арина
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на обман

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

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

Жаба с кошельком

Донцова Дарья
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Жаба с кошельком

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

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

Академия чаросвет. Тень

Ярошинская Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Академия чаросвет. Тень

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4