Средства межпроцессного взаимодействия (IPC) в ОС LINUX. Семафоры и разделяемая память. Ненадежные сигналы, страница 8

SIGEV_SIGNAL_INIT( &notification, SIGUSR1 );

if( mq_notify( msg_queue_id, &notification ) < 0 )

{

printf( "Server: set notify mode queue error!!!\n" );

exit(2);

}

/* Ожидаем сообщений от клиента  */

while(1)

{

// Ожидаем сигнала //

pause( );

}

return EXIT_SUCCESS;

}

Листинг 7.2. Пользовательские обработчики сигналов. Файл mysignal.h.

/*

* Обработкчики сигналов

*/

#ifndef MYSIGNAL_H_

#define MYSIGNAL_H_

#define BUF_LEN     80

#define QUEUE_NAME  "server_queue"

/* Обработчки сигнала SIGINT */

void sigint_handler( int );

/* Обработчки сигнала SIGUSR1 */

void sigusr1_handler( int );

#endif

Листинг 5.1.3. Пользовательские обработчики сигналов. Файл mysignal.c.

#include <stdlib.h>

#include <signal.h>

#include <stdio.h>

#include <mqueue.h>

#include "mysignal.h"

char   buff[ BUF_LEN ];

uint_t prio;

/* Обработчик сигнала SIGINT */

void sigint_handler( int signo )

{

extern mqd_t msg_queue_id;

/* Закрываем очередь сообщений */

if( mq_close( msg_queue_id ) < 0 )

{

printf( "Server: close queue error!!!\n" );

exit(3);

}

/* Удаление очереди сообщений */

if( mq_unlink( QUEUE_NAME ) < 0 )

{

printf( "Server: delete queue error!!!\n" );

exit(4);

}

printf( "Server: terminate\n" );

exit(0);

}

/* Обработчки сигнала SIGUSR1 */

void sigusr1_handler( int signo )

{

extern mqd_t msg_queue_id;

extern struct sigevent    notification;

/* Принимаем сообщение */

int n;

n = mq_receive( msg_queue_id, buff, BUF_LEN, &prio );

if( n < 0 )

{

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

return;

}

printf( "Server: message received, length = %d\n", n );

printf( "Message: %s\n", buff );

printf( "Prio: %d\n", prio );

/* Отправляем клиенту уведомление */

strcpy( buff, "OK" );

buff[2] = '\0';

prio = 31;

if( mq_send( msg_queue_id, buff, strlen(buff), prio ) < 0 )

{

printf( "Server: send message error!!!\n" );

return;

}

/* Восстанавливаем диспозицию */

signal( SIGUSR1, sigusr1_handler );

/* Перерегистрируемся */

if( mq_notify( msg_queue_id, &notification ) < 0 )

{

printf( "Server: set notify mode queue error!!!\n" );

return;

}

}

Сервер

Клиен

# ./server Server: start. Server: message received, length = 6 Message: qwerty Prio: 4 Server: message received, length = 3 Message: hi!rty Prio: 4 Server: message received, length = 6 Message: fl;lsd Prio: 7 Server: message received, length = 8 Message: fgklksgf Prio: 1

# ./client /net/SPOcomp3/home/gr40812/dorogoff/5_msg_server/server_queue 4 Client: connect is OK. Message: qwerty Client: send message is OK. Client: message received, length = 2 Message: OK. Prio: 31 # ./client /net/SPOcomp3/home/gr40812/dorogoff/5_msg_server/server_queue 4 Client: connect is OK. Message: hi! Client: send message is OK. Client: message received, length = 2 Message: OK. Prio: 31 # ./client /net/SPOcomp3/home/gr40812/dorogoff/5_msg_server/server_queue 7 Client: connect is OK. Message: fl;lsd Client: send message is OK. Client: message received, length = 2 Message: OK. Prio: 31 # ./client /net/SPOcomp3/home/gr40812/dorogoff/5_msg_server/server_queue 1 Client: connect is OK. Message: fgklksgf Client: send message is OK. Client: message received, length = 2 Message: OK. Prio: 31

Результаты работы аналогичны результатам из пункта 1.5.

          Выводы.

Операционной системы QNX Neutrino 6.5.0 поддерживает такие средства межпроцессного взаимодействия стандарта POSIX, как именованные и неименованные каналы, очереди сообщений, разделяемая память.

Используемые источники.

[1]. Уильям Стивенс. Unix, взаимодействие процессов.