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

printf( "Client: MsgSend error!" );

exit(3);

}

printf( "Client: Reply msg - <%s>\n", replyBuff );

}

return EXIT_SUCCESS;

}

void SigintHandler( int signo ) {

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

ConnectDetach( connectId );

exit( EXIT_SUCCESS );

}

Результаты работы программы.

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

Локальный вариант:

Параметры командной строки для клиента - 1 3272741 QNX_VM. (Указываются в Run Configuration → Arguments ).

Сервер

Клиент

Server: create channel. CH_ID=1, PID=3272741

Server: Receive msg.

Server: msg - <hi!>

Server: Receive msg.

Server: msg - <;lkf>

Server: Receive msg.

Server: msg - <2>

Message: hi!

Client: Reply msg - <Server reply to client RCV_ID=2>

Message: ;lkf

Client: Reply msg - <Server reply to client RCV_ID=2>

Message: 2

Client: Reply msg - <Server reply to client RCV_ID=2>

Message:

Сетевой вариант:

Параметры командной строки для клиента 1 495639 Ead3ec8f. (Указываются в Run Configuration → Arguments ).

Сервер

Клиент

Server: create channel. CH_ID=1, PID=495639

Server: Receive msg.

Server: msg - <sd>

Server: Receive msg.

Server: msg - <12343>

Server: Receive msg.

Server: msg - <3>

Message: sd

Client: Reply msg - <Server reply to client RCV_ID=2>

Message: 12343

Client: Reply msg - <Server reply to client RCV_ID=2>

Message: 3

Client: Reply msg - <Server reply to client RCV_ID=2>

Message:

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

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

Листинг 2.4.1. Программа сервера. 2_2_4_msg_server_name_attach.c.

#include <stdlib.h>

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <errno.h>

#include <signal.h>

#include <time.h>

#include <sys/dispatch.h>

#define ATTACH_POINT      "qnx_msg_server"

#define      BUF_LEN                   256

#define CODE_TIMER        1

#define CODE_KBD_INT      2

typedef union {

struct

_pulse       pulse_msg;

char   msg_buff[ BUF_LEN ];

} Msg_T;

void Sigint_Handler( int );

void PulseProc( );

void ClientMsgProc();

name_attach_t*      msg_chanel;

dispatch_t*         dpp;

Msg_T               msg;

int                 rcv_id;

struct

_msg_info           msg_info;

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

{

// Проверка командных опций программы //

if( argc < 2 ) {

printf( "Server: cmd args error!\n" );

exit(1);

}

unsigned int flag;

if (strcmp(argv[1],"-l" ) == 0)               flag = 0;

else if (strcmp(argv[1],"-g" ) == 0)   flag = NAME_FLAG_ATTACH_GLOBAL;

else {

printf( "Server: cmd args error!\n" );

exit(2);

}

// Отключаем буферизацию вывода //

setbuf( stdout, NULL );

// Регистрация канала //

dpp = dispatch_create( );

msg_chanel = name_attach( dpp, ATTACH_POINT, flag );

if (msg_chanel == NULL){

printf( "Server: name attach error!\n" );

exit(3);

}

printf( "Server: started.\n");

// Завершение сервера по SIGINT //

signal( SIGINT, Sigint_Handler );

// Цикл ожидания и приема сообщений //

while (1)

{

rcv_id = MsgReceive( msg_chanel->chid, &msg, sizeof(msg), &msg_info );

switch (rcv_id)

{

// Ошибка //

case -1:

printf( "Server: msg receive error!\n" );

exit(4);

break;

// Принят пульс //

case 0:

PulseProc( );

break;

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

default:

if (msg.pulse_msg.type == _IO_CONNECT ) {