Сигналы. Сетевая доставка сигналов. Системный вызов. Отправка сигнала процессу на удаленном узле. Программа приема сигнала

Страницы работы

Содержание работы

1. Сигналы. Сетевая доставка сигналов.

Сигналы  являются  асинхронными  сообщениями  предопределенного формата и используются  для передачи уведомлений о происшедших событиях.  

Системные вызовы микроядра QNX для обмена сигналами:

Системный вызов

Описание

SignalKill()

Послать  сигнал  к  потоку,  процессу  или группе процессов

SignalAction()  

Установка диспозиции

SignalProcmask()

Изменить маску блокировки сигналов для потока

SignalSuspend()

Блокировать  поток,  пока  сигнал  обрабатывается

SignalWaitinfo()

Ожидать  сигнал  и  возвратить  информацию при приеме сигнала

Следующая программа посылает сигнала процессу на удаленном узле сети с помощью функции SignalKill.

Дескриптор удаленного узла можно получить по известному имени узла с помощью функции netmgr_strtond(). Имя узла и pid процесса задаются из командной строки.

Листинг 1.1. Программа отправки сигнала. Файл 2_1_net_signal_sender.c.

/*

* Отправка сигнала процессу на удаленном узле

* pid-процесса и имя компа задаются из командной строки

*/

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/neutrino.h>

#include <sys/netmgr.h>

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

{

if (argc<3) {

printf( "Comand line args error!");

exit(1);

}

pid_t pid = atoi( argv[2] );

int nd = netmgr_strtond( argv[1], NULL );

SignalKill( nd,  pid, 0, SIGINT, 0, 0 );

return EXIT_SUCCESS;

}

Листинг 1.2. Программа приема сигнала. Файл 2_1_net_signal_recipient.c.

/*

* Прием сигнала SIGINT

*/

#include <stdlib.h>

#include <stdio.h>

#include <signal.h>

void SigintHandler( int signo );

int exitFlag=0;

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

{

printf( "Program Started\n" );

signal( SIGINT, SigintHandler );

while (1) {

if (exitFlag!=0) break;

}

printf( "Program Termonated\n" );

return EXIT_SUCCESS;

}

void SigintHandler( int signo )

{

printf( "SIGINT is handled\n" );

exitFlag = 1;

}

Результаты работы:

      ./net_signal_recipient

Program Started

./net_signal_sender EAd3ec8f 798760

      ./net_signal_recipient

Program Started

SIGINT is handled

Program Termonated

Trace Log для передачи сигнала по сети. (Для 2_1_net_signal_sender.)


            В следующей таблице видно, что запускается при сетевой доставке сигнала запускается io-pkt-v4-hc — менеджер сети.


Trace Log для приема сигнала по сети. Для 2_1_net_signal_sender.


По Trace Log видно, что процессу неизвестно от какого другого процесса был получен сигнал. Известно, что это сигнал с кодом 0.

Для сравнения, Trace Log локальной передачи сигнала.


Отличие сетевой посылки сигнала от локальной — при сетевой передаче сигнала поток отправитель переходит в состояние NetReply, ожидая подключения к удаленному узлу, и сразу при этом запускается менеджер сети io-pkt-v4-hc qnet server. При локальной передаче сигнала передающий поток не блокируется.

При локальной передаче сигнала, так же не известно от какого процесса был получен сигнал.


2. Передача сообщений и пульсов.

В QNX Neutrino  программные  потоки  взаимодействуют  не  напрямую друг  с  другом,  а  через  специальные  объекты,  называемые  каналом и соединением. Поток сервера, который желает получить сообщение, сначала создает канал; другой поток – клиент, который желает послать сообщение к потоку сервера, должен  создать  соединение  с  каналом.Каналы  и  соединения  после  своего создания  получают идентифицирующие номера – малые целые числа, которые берутся из  пространства файловых дескрипторов.

Следующие две программы демонстрируют обмен сообщениями между не родственными процессами.

Для того, что бы клиент мог подсоединится к каналу сервера, нужно чтобы сервер зарегистрировал системное имя канала, поскольку между не родственными сообщениями нет возможности передавать сообщения.

Для этих целей можно использовать следующие системные вызовы:

Системный вызов

Описание

name_attach()

Регистрировать имени и создание  канала

name_open()

Получение идентификатора соединения

name_close() 

Уничтожить соединение с каналом

name_detach()

Удалить имя из пространства имен и созданный канал

Так же возможно зарегистрировать глобальное имя канала, если использовать в вызове name_attach() флаг  NAME_FLAG_ATTACH_GLOBAL. Созданное глобальное имя будет известно процессам во всей сети и тогда можно будет взаимодействовать нескольким потокам, находящимся на различных узлах.

Посылка и прием сообщений осуществляются с помощью следующих вызовов:

Похожие материалы

Информация о работе