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

MsgReply( rcv_id, EOK, NULL, 0 );

} else {

ClientMsgProc( );

}

break;

}

}

// Удаление канала //

name_detach( msg_chanel, 0 );

return EXIT_SUCCESS;

}

void Sigint_Handler( int signo ) {

// Удаление канала //

name_detach( msg_chanel, 0 );

printf( "\nSetver: terminate. Chanel delete.\n" );

exit(EXIT_SUCCESS);

}

void PulseProc( )

{

time_t       tmm;

struct tm *now;

switch( msg.pulse_msg.code )

{

// Пульс от таймера //

case CODE_TIMER:

tmm = time( NULL );

now = localtime( &tmm );

printf( "Recieved pulse from Timer: %2.2d:%2.2d:%2.2d.\n", now->tm_hour, now->tm_min, now->tm_sec );

break;

// Пульс из прерывания клавиатуры //

case CODE_KBD_INT:

printf( "Recieved pulse from Kbd_Isr. KeyNum=%d.\n", msg.pulse_msg.value.sival_int );

break;

default:

break;

}

}

void ClientMsgProc( )

{

printf( "PID=%d, ND=%d. ", msg_info.pid, msg_info.nd );

printf( "Recieved Message: %s\n", msg.msg_buff );

strcpy( msg.msg_buff, "OK!" );

MsgReply( rcv_id, EOK, &msg, sizeof(msg) );

}

Листинг 2.4.2. Программа клиента. 2_2_4_msg_client_name_open.c.

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <unistd.h>

#include <signal.h>

#include <sys/dispatch.h>

#define ATTACH_POINT      "qnx_msg_server"

#define BUF_LEN                  256

void sigint_handler( int );

int connect_id;

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

{

char   send_buff[ BUF_LEN ];

char   reply_buff[ BUF_LEN ];

if (argc < 2) {

printf( "Client: 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( "Client: cmd args error!\n" );

exit(2);

}

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

setbuf( stdout, NULL );

// Открытие канала //

connect_id = name_open( ATTACH_POINT, flag );

if (connect_id == -1) {

printf( "Client: name open error!\n" );

exit(3);

}

printf( "Client: started. PID=%d.\n", getpid() );

signal( SIGINT, sigint_handler );

while(1)

{

printf( "Message: ");

scanf( "%s", send_buff );

if ( MsgSend( connect_id, send_buff, sizeof(send_buff), reply_buff, sizeof(reply_buff) ) == -1 ) {

printf( "Client: send msg error!\n" );

break;

}

printf( "Server reply message: %s \n", reply_buff );

fflush( stdout );

}

// Закрытие локального канала //

name_close( connect_id );

return EXIT_SUCCESS;

}

void sigint_handler( int signo ) {

// Закрытие канала //

name_close( connect_id);

printf( "\nClient: terminate.\n" );

exit(0);

}

Результаты работы программы. Программы тестировались в лаборатории на одном (локальная передача) и нескольких (сетевая передача) компьютерах.

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

Server

Client

$ ./server -l Server: started. PID=1490999, ND=0. Recieved Message: yo! PID=1490999, ND=0. Recieved Message: 666 PID=1495096, ND=0. Recieved Message: qwerty Setver: terminate. Chanel delete. $

$ ./client -l Client: started. PID=1490999. Message: yo! Server reply message: OK! Message: 666 Server reply message: OK! Message: Client: terminate. $

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

Предварительно надо запустить gns на используемых узлах сети.

/usr/sbin/gns -s — на компьютере сервера и /usr/sbin/gns -с на компьютере сервера.

Server

Client

# /home/gr40812/dorogoff/msg/server -g Server: started. PID=1396784, ND=2. Recieved Message: jfj PID=1396784, ND=2. Recieved Message: fkl Setver: terminate. Chanel delete. $

# ./client -g Client: started. PID=1396784. Message: jfj Server reply message: OK! Message: fkl Server reply message: OK! Message: Client: terminate.