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

channelId = ChannelCreate(0);

sleep(1);

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

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 );

pthread_exit(NULL);

}

// Потоки клиентов //

void* client( void* param )

{

int    connectId;

char   sendBuff[256],

replyBuff[256];

pid_t pid = getpid();

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

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 );

pthread_exit( NULL );

}

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

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

Server: message <Msg example> received

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

2.3. Передача сообщений между независимыми процессами (не именованные каналы).

Для возможности передачи сообщения, необходимо создать соединение с каналом. А это можно сделать, если известны  три параметра — ND/PID/CHID.

Обмен сообщениями между клиентом и сервером организован следующим образом.

Сервер создает канал. Параметры  ND/PID/CHID передаются клиенту в качестве аргументов командной строки.

Листинг 2.3.1. Программа-сервер. 2_2_3_msg_server_ChannelCreate.c.

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <signal.h>

#include <sys/neutrino.h>

int channelId;

void SigintHandler( int signo );

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

{

setbuf( stdout, NULL );

signal( SIGINT, SigintHandler);

char receiveBuff[256];

char replyBuff[256];

// СОздание канала //

if (( channelId = ChannelCreate(0) )==-1) {

printf( "Server: create channel error!\n" );

exit(1);

}

printf( "Server: create channel. CH_ID=%d\n", channelId );

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

while (1)

{

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

switch (rcvId)

{

// Ошибка //

case -1:

printf( "Server: MsgReceive error.\n" );

break;

// Пульс //

case 0:

printf( "Server: Receive pulse.\n" );

break;

// Сообщение //

default:

printf( "Server: Receive msg.\n" );

printf( "Server: msg - <%s>\n", receiveBuff );

sprintf( replyBuff, "Server reply to client RCV_ID=%d", rcvId );

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

break;

}

}

return EXIT_SUCCESS;

}

void SigintHandler( int signo ) {

// Уничтожение канала //

ChannelDestroy( channelId );

exit( EXIT_SUCCESS );

}

Листинг 2.3.2. Программа-клиента. 2_2_3_msg_client_ConnectAttach.c.

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <signal.h>

#include <sys/neutrino.h>

#include <sys/netmgr.h>

void SigintHandler( int signo );

int connectId;

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

{

setbuf( stdout, NULL );

signal( SIGINT, SigintHandler);

char sendBuff[256];

char replyBuff[256];

int channelId, ownerPid, nd;

channelId = atoi( argv[1] );

ownerPid = atoi( argv[2] );

nd = netmgr_strtond( argv[3], NULL );

connectId = ConnectAttach( nd, ownerPid, channelId, 0, 0 );

if (connectId == -1 ){

printf( "Client: ConnectAttach error!" );

exit(2);

}

while (1) {

printf( "Message: " );

scanf( "%s", sendBuff );

if( MsgSend( connectId, sendBuff, sizeof(sendBuff), replyBuff, sizeof(replyBuff) )==-1) {