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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.

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

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. Созданное глобальное имя будет известно процессам во всей сети и тогда можно будет взаимодействовать нескольким потокам, находящимся на различных узлах.

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

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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.