IPC микроядра на примере QNX Neutrino. Передача сообщений (функции send, receive, reply), страница 2

ConnectDetach(coid);

return EXIT_SUCCESS;

exit (EXIT_FAILURE);

}

strcpy(send_buf, "Client: Answer");

printf("\nCLIENT: I send [%s]\n", &send_buf );

status=MsgSend(coid,  &send_buf, sizeof(send_buf), &reply_buf, sizeof(reply_buf));

if (status==-1){

printf("Error MsgSend\n");

perror (NULL);

exit (EXIT_FAILURE);

}    

if(strlen(reply_buf)>0){

printf("Pr : \"%s\"\n", reply_buf);

}

printf("\nEnd Client\n");

ConnectDetach(coid);

return EXIT_SUCCESS;

}

void *thread1( void *t )

{

int   rcvid, chid, pid, ppid;

char  receive_buf[25], reply_buf[25];

chid=ChannelCreate(0);

while(1){

rcvid=MsgReceive(chid, &receive_buf, sizeof(receive_buf), NULL);

printf("\nSERVER: I receive [%s]\n", &receive_buf );

strcpy(reply_buf, "Answer");

printf("\nSERVER: I reply [%s]\n", &reply_buf );

MsgReply(rcvid, 777, &reply_buf, sizeof(reply_buf));

}

ChannelDestroy(chid);

printf("\nEnd server\n" );

return EXIT_SUCCESS;

}

Результаты:

# ./th

1044526

CLIENT: I send [Client: Answer]

SERVER: I receive [Client: Answer]

SERVER: I reply [Answer]

Pr : "Answer"

End Client

Результат выполнения программы аналогичен предыдущему. В данном случае запускается только одна программа.

               1.3. между независимыми процессами (с передачей pid)

Связь клиента сс сервером осуществляется посредством передачи в качестве аргумента pid процесса сервера.

client:

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#include <stdlib.h>

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

{

int   coid;

int   status;

int pid=atoi(argv[1]);

char  send_buf[25],

reply_buf[25];

printf("%d", pid );

coid=ConnectAttach(0,pid,1,0,0);

if (coid==-1){

printf("Error ConnectAttach\n");

perror (NULL);

exit (EXIT_FAILURE);

}

strcpy(send_buf, "Client: Answer");

printf("\nCLIENT: I send [%s]\n", &send_buf );

status=MsgSend(coid,  &send_buf, sizeof(send_buf), &reply_buf, sizeof(reply_buf));

if (status==-1){

printf("Error MsgSend\n");

perror (NULL);

exit (EXIT_FAILURE);

}

if(strlen(reply_buf)>0){

printf("Pr : \"%s\"\n", reply_buf);

}

printf("\nEnd Client\n");

ConnectDetach(coid);

return EXIT_SUCCESS;

}

Server

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#include <stdlib.h>

int main (void)

{

int   rcvid, chid;

char  receive_buf[25], reply_buf[25];

chid=ChannelCreate(0);

while(1){

rcvid=MsgReceive(chid, &receive_buf, sizeof(receive_buf), NULL);

printf("\nSERVER: I receive [%s]\n", &receive_buf );

strcpy(reply_buf, "Answer");

printf("\nSERVER: I reply [%s]\n", &reply_buf );

MsgReply(rcvid, 777, &reply_buf, sizeof(reply_buf));

}

ChannelDestroy(chid);

printf("\nEnd server\n" );

return EXIT_SUCCESS;

}

Откомпилируйте программы (gcc -o server server.c; gcc -o client client.c), запустите на выполнение исполняемые модули ./server и ./client, отправьте процессу server сигнал SIGINT. 

Результаты:

#

#  ./server&

[1] 2150438

# ./client 2150438

2150438

CLIENT: I send [Client: Answer]

SERVER: I receive [Client: Answer]

SERVER: I reply [Answer]

Pr : "Answer"

End Client

# kill SIGINT 2150438

[1] + Terminated           ./server

#

После создания канала сервер вызывает функцию MsgReceive, и переходит в состояние Receive-block, пока ему не отправят сообщение. Клиент вызывает функции ConnectAttach, открывая при этом канал, через который он будет отсылать сообщение серверу. Посылка сообщения осуществляется с помощью команды MsgSend(), после которой клиент уходит в состояние Send-block, а сервер получает сообщение, обрабатывает его и отвечает клиенту с помощью функции MsgReply(). В рассмотренном случае сервер идентифицируется по своему PID.