Жанры книг
Мы в соц.сетях
ParaKnig📚 » Компьютеры и Интернет » Интернет » QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович
<< На главную

QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович

Читать онлайн QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 41 42 43 44 45 46 47 48 49 ... 106
Перейти на страницу:

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

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

Весьма доходчивый пример для проверки и иллюстрации обработки сигналов реального времени приведен У. Стивенсом [2]. Мы же построим приложение, реализующее его основную идею: [33]

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

#include &lt;stdlib.h&gt;

#include &lt;stdio.h&gt;

#include &lt;iostream.h&gt;

#include &lt;signal.h&gt;

#include &lt;unistd.h&gt;

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

 cout &lt;&lt; &quot;received signal &quot; &lt;&lt; signo &lt;&lt; &quot; code = &quot; &lt;&lt; info-&gt;si_code &lt;&lt;

  &quot; val = &quot; &lt;&lt; info-&gt;si_value.sival_int &lt;&lt; endl;

}

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

 cout &lt;&lt; &quot;signal SIGRTMIN=&quot; &lt;&lt; (int)SIGRTMIN

  &lt;&lt; &quot; - signal SIGRTMAX=&quot; &lt;&lt; (int)SIGRTMAX &lt;&lt; endl;

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

 fin = SIGRTMAX - num, seq = 3;

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

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

  switch(opt) {

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

   if (sscanf(optarg, &quot;%i&quot;, &amp;val) != 1)

    perror(&quot;parse command line failed&quot;), exit(EXIT_FAILURE);

   beg = val;

   break;

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

   if (sscanf(optarg, &quot;%i&quot;, &amp;val) != 1)

    perror(&quot;parse command line failed&quot;), exit(EXIT_FAILURE);

   fin = val;

   break;

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

   if (sscanf(optarg, &quot;%i&quot;, &amp;val) != 1)

    perror(&quot;parse command line failed&quot;), exit(EXIT_FAILURE);

   seq = val;

   break;

  default:

   exit(EXIT_FAILURE);

  }

 }

 num = fin - beg;

 fin += num &gt; 0 ? 1 : -1;

 sigset_t sigset;

 sigemptyset(&amp;sigset);

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

  sigaddset(&amp;sigset, i);

 pid_t pid;

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

 if (pid - fork() == 0) {

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

  sigprocmask(SIG_BLOCK, &amp;sigset, NULL);

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

   struct sigaction act, oact;

   sigemptyset(&amp;act.sa_mask);

   act.sa_sigaction = handler;

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

   act.sa_flags = SA_SIGINFO;

   if (sigaction(i, &amp;act, NULL) &lt; 0) perror(&quot;set signal handler: &quot;);

  }

  cout &lt;&lt; &quot;CHILD: signal mask set&quot; &lt;&lt; endl;

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

  cout &lt;&lt; &quot;CHILD: signal unblock&quot; &lt;&lt; endl;

  sigprocmask(SIG_UNBLOCK, &amp;sigset, NULL);

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

  exit(EXIT_SUCCESS);

 }

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

 sigprocmask(SIG_BLOCK, &amp;sigset, NULL);

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

 sleep(1);

 union sigval value;

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

  for (int j = 0; j &lt; seq; j++) {

   value.sival_int = j;

   sigqueue(pid, i, value);

   cout &lt;&lt; &quot;signal sent: &quot; &lt;&lt; i &lt;&lt; &quot; with val = &quot; &lt;&lt; j &lt;&lt; endl;

  }

 }

 cout &lt;&lt; &quot;PARENT: finished!' &lt;&lt; endl;

 exit(EXIT_SUCCESS);

}

1 ... 41 42 43 44 45 46 47 48 49 ... 106
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Лариса
Лариса 11.03.2026 - 20:17
Странно,здесь имя девочки Аграфена,а на других сайтах я прослушала три книги этого цикла с именем Дарвина.Зачем менять имя и путать читателей? Опечатка- не Дарвина,  а  Дарина.
Григорий
Григорий 09.04.2025 - 22:24
Лучшая книга всех времен
Женя
Женя 02.04.2025 - 16:08
Любимая книга