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

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

Описание

MsgSend()

Отправка сообщения. Переход потока в блокированное состояние пока не придет ответ.

MsgReceive()

Ожидание сообщения и его прием. Поток находится в блокированном состоянии пока сообщение не пришло.

MsgReply()

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

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

Пример с исходным кодом будет рассмотрен далее (пример совместный с пульсами).

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

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

Описание

ChannelCreate() 

Создать канал для приема сообщений

ChannelDestroy()

Уничтожить канал

ConnectAttach()

Создать соединение для передачи сообщения

ConnectDetach()

Уничтожить соединение

            2.1. Передача сообщений между родственными процессами.

Листинг 2.1. 2_2_1_related_processes_msg.c.

/*

* Обмен сообщениями между родственными процессами

*/

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <pthread.h>

#include <unistd.h>

#include <errno.h>

#include <sys/neutrino.h>

int channelId;                         // Идентификатор канала

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

{

char   receiveBuff[256],

replyBuff[256];

int    rcvId;

// Cоздание канала //

channelId = ChannelCreate(0);

pid_t child_pid = fork();

if (child_pid == -1) {

printf( "Create process error!\n" );

exit(1);

}

else if (child_pid == 0) {

// Процесс-потомок //

int    connectId;

char   sendBuff[256],

replyBuff[256];

pid_t pid = getppid();

// Создать соединение //

connectId = ConnectAttach( 0, pid, channelId, 0, 0 );

// Передача сообщения //

strcpy( sendBuff, "Msg example");

MsgSend( connectId, sendBuff, sizeof(sendBuff), replyBuff, sizeof(replyBuff) );

printf ( "Client: message <%s> received \n", replyBuff );

// Уничтожить соединение //

ConnectDetach( connectId );

return EXIT_SUCCESS;

}

// Прием сообщения //

rcvId = MsgReceive(channelId, receiveBuff, sizeof(receiveBuff), NULL);

printf ( "Server: message <%s> received \n", receiveBuff );

strcpy(replyBuff, "Msg from Server. OK!");

// Передача ответа //

MsgReply( rcvId, EOK, replyBuff, sizeof(replyBuff) );

ChannelDestroy( channelId );

return EXIT_SUCCESS;

}

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

Программы запускались прямо из IDE(Run As C/C++ QNX Application). Результаты работы выводятся на консоль в IDE.

Server: message <Msg example> received

Client: message <Msg from Server. OK!> received

2.2. Передача сообщений между потоками одного процсса.

Листинг 2.2. 2_2_2_threads_msg.c

/*

* Обмен сообщениями между потоками одного процесса

*/

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <pthread.h>

#include <unistd.h>

#include <errno.h>

#include <sys/neutrino.h>

void* server( void* );

void* client( void* );

int channelId;                         // Идентификатор канала

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

{

pthread_t    serverTid,

clientTid;

pthread_create( &serverTid, NULL, server, NULL );

pthread_create( &clientTid, NULL, client, NULL );

pthread_join( clientTid, NULL );

return EXIT_SUCCESS;

}

// Поток сервера //

void* server( void* param )

{

char   receiveBuff[256],

replyBuff[256];

int    rcvId;

// Cоздание канала //