Сообщения и пульсы в QNX Neutrino. Передача сообщений между родственными процессами. Передача сообщений с помощью MsgSend, страница 4

int                                      fd;

char                               sbuf[255], rbuf[255];

fd = name_open( PATH, 0 );

if( fd == -1 ){

printf("Client name open error ???\n" );

exit( EXIT_FAILURE );

}

strcpy( sbuf, "I am the client" );

MsgSend( fd, &sbuf[0], sizeof(sbuf), &rbuf[0], sizeof(rbuf) );

printf("CLIENT!!!\n  Client get = %s \n", rbuf );

MsgSendPulse( fd, 10, 10, 5 );

name_close( fd );

return 0;  

}

Пример вызова программы:

Script started on Wed Mar 31 04:36:52 2010

# ./serv

# ./client

SERVER tell with you!!!

Serv get msg = I am the client

CLIENT!!!

Client get = Hello Client!!

Server get pulse!

Server get pulse!

Пример использования функции MsgReceivePulse приведён ниже.

Листинг 7. Serv_Pilse.c

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

#include <sys/neutrino.h>

#include <sys/iomsg.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#define ATTACH_POINT "channel_lab1"

#define MY_PULSE1  _PULSE_CODE_MINAVAIL+1

#define MY_PULSE2  _PULSE_CODE_MINAVAIL+2

int main(){

name_attach_t           *attach;

int                     rcvid, val;

struct _pulse           pulse;

if ((attach = name_attach(NULL, ATTACH_POINT, 0)) == NULL) {

printf("name Attach fail ???\n");

return EXIT_FAILURE;

}

while(1){

rcvid = MsgReceivePulse( attach->chid, &pulse, sizeof( pulse ), NULL );

if( pulse.code > 0 ){

//User Pulse

switch( pulse.code ){

case MY_PULSE1:

printf("Get User Pulse 1 : value = %d\n", pulse.value.sival_int );

break;

case MY_PULSE2:

printf("Get User Pulse 2 : value = %d\n", pulse.value.sival_int );

break;

}//end switch

} else{

printf("Get system pulse\n");

if( pulse.code == _PULSE_CODE_DISCONNECT )

printf("Client disconnect\n");

}

}//end while(1)

name_detach(attach, 0);

return 0;

}

Листинг 8. Cl_pulse.c

#include <sys/neutrino.h>

#include <stdlib.h>

#include <stdio.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#define PATH "channel_lab1"

#define MY_PULSE1  _PULSE_CODE_MINAVAIL+1

#define MY_PULSE2  _PULSE_CODE_MINAVAIL+2

int main(){

int                           fd;

struct _pulse                 pulse;

fd = name_open( PATH, 0 );

if( fd == -1 ){

printf("Client name open error ???\n" );

exit( EXIT_FAILURE );

}

MsgSendPulse( fd, 10, MY_PULSE1, 18 );  

MsgSendPulse( fd, 10, MY_PULSE2, 5 );

name_close( fd );

return 0;  

}

Пример вызова программы:

# ./serv_pulse

# ./cl_pulse

Get User Pulse 1 : value = 18

Get User Pulse 2 : value = 5

Get system pulse

Client disconnect

4. Обработка запросов клиентов агентами

Создадим сервер, который не обрабатывает запросы, а перенаправляет их агентам. Таким образом, в начале работы сервер запускает агентов, они регистрируются у сервера и ожидают, пока сервер даст и работу. Когда клиент посылает серверу запрос, сервер сразу же перенаправляет его агенту и ждёт следующего запроса. Если же запросов от клиентов больше чем агентов, то этот запрос встаёт в очередь, и ждёт пока освободиться агент.

Serv.c

#include <stdio.h>

#include <errno.h>

#include <stdlib.h>

#include <string.h>

#include <sys/dispatch.h>

#include <string.h>

#include <process.h>

#define ATTACH_POINT "channel_lab1"

name_attach_t           *attach;

struct _msg_info  *info;

int                                      nbyte=255, rcvid, num_agent=0, table[5], i, buf_rcvid, num_client=0, rcvid_tab[200];

char                               buf[255], msg[255], str[255], simb;

void send_to_agent();

int main(){

if ((attach = name_attach(NULL, ATTACH_POINT, 0)) == NULL) {

printf("name Attach fail ???\n");

return EXIT_FAILURE;

}

for( i=0; i< 5; i++ ){

spawnl( P_NOWAIT, "agent", "agent", NULL );

}

while(1){

rcvid = MsgReceive( attach->chid, &buf[0], sizeof(buf), NULL );

if( rcvid > 0 ){

printf("Server get message = %s\n", buf );

sscanf( buf, "%s %d %s", str, &buf_rcvid, msg);