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

strcpy( buf, "sending msg!!!" );

MsgSend( coid, buf, 255, rbuf, 255 );

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

return 0;

}

Результат выполнения программы:

# ./serv& [1] 708652

# SERV create channel = 1 ; PID server = 708652

./client 1 708652

SERVER tell with you!!!

Server get msg = sending msg!!!

CLIENT!!!

Client get msg = Server get msg!

[1] + Done                 ./serv

2.3. Регистрация сервера по имени

Для регистрации сервера по имени используется функция:

FILE* popen( const char* command,

const char* mode );

С помощью этой функции мы используя команду pidin находим pid сервера, и подключаемся к нему с помощью команды ConnectAttach.

FILE *f;

f = popen("pidin | grep ./serv", "r" );

Serv.c

#include <sys/neutrino.h>

#include <stdio.h>

#include <stdlib.h>

int main(){

int               rcvid, nbyte=255;

char        buf[255], chid_s[10];

pid_t       chid ;

struct _msg_info* info;

chid = ChannelCreate( 0 );

printf("SERV create channel = %d\n", chid);

rcvid = MsgReceive( chid, buf, nbyte, info );

if( rcvid > 0 ){

// Message

printf( "SERVER tell with you!!!\n  Server get msg = %s\n", buf );

if( MsgReply( rcvid, 0, "Server get msg!", nbyte ) == -1 )

printf("SERVER???\n  Don't Reply message to client\n");

}

return 0;

}

Client.c

#include <sys/neutrino.h>

#include <stdio.h>

#include <stdlib.h>

int main( int argc, char** argv ){

int               coid, nbyte=255, chid, ppid;

char        buf[255], rbuf[255];

struct _msg_info* info;

FILE *f;

f = popen("pidin | grep ./serv", "r" );

fscanf( f, "%s", buf );

ppid = atoi( buf );

chid = atoi( argv[1] );

//ppid = atoi( argv[2] );

coid = ConnectAttach( 0, ppid, chid, 0, 0 );

if( coid == -1 ){

printf("Error connect ID???\n");

exit( EXIT_FAILURE );

}

strcpy( buf, "sending msg!!!" );

MsgSend( coid, buf, 255, rbuf, 255 );

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

return 0;

}

Результат выполнения программы:

# ./serv& [1] 1540143

# SERV create channel = 1

./client 1 SERVER tell with you!!!

Server get msg = sending msg!!!

CLIENT!!!

Client get msg = Server get msg!

[1] + Done                 ./serv

#

3. Передачапульсов

В отличии от сообщений, пульсы не требуют ответа. Т.е. клиент пославший пульс не перейдёт в состояние Send-block, а продолжит выполняться.

Сервер может принимать пульсы как с помощью функции MsgReceivePulse(), так и с помощью MsgReceive(). При использовании функции MsgReceive оповещением о том, что пришёл пульс будет равенство нулю выходного значения.

Использование функции MsgReceive для приёма пульсов показано на примере в программах приведенных ниже.

Листинг 5. Server.c

#include <stdio.h>

#include <errno.h>

#include <stdlib.h>

#include <string.h>

#include <sys/dispatch.h>

#include <string.h>

#define ATTACH_POINT "channel_lab1"

typedef struct _my_date{

struct _pulse     pulse;

char                          buf[255];

} my_dat;

int main(){

name_attach_t           *attach;

struct _msg_info  *info;

int                                nbyte=255, rcvid, val;

char                               buf[255];

my_dat                             dat;

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

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

return EXIT_FAILURE;

}

while(1){

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

if( rcvid > 0 ){

//Message

printf("SERVER tell with you!!!\n  Serv get msg = %s\n", buf );

strcpy( buf, "Hello Client!!" );

MsgReply( rcvid, 0, &buf[0], sizeof( buf ) );

} else if( rcvid == 0 ){

//Pulse

printf("Server get pulse!\n" );

}

}//end while(1)

name_detach(attach, 0);

return 0;

}

Листинг 6. Client.c

#include <sys/neutrino.h>

#include <stdlib.h>

#include <stdio.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#define PATH "channel_lab1"

int main(){