SIGEV_SIGNAL_INIT( ¬ification, SIGUSR1 );
if( mq_notify( msg_queue_id, ¬ification ) < 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, ¬ification ) < 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, взаимодействие процессов.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.