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. Созданное глобальное имя будет известно процессам во всей сети и тогда можно будет взаимодействовать нескольким потокам, находящимся на различных узлах.
Посылка и прием сообщений осуществляются с помощью следующих вызовов:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.