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

Страницы работы

Содержание работы

Санкт-Петербургский Государственный Политехнический Университет

Факультет Технической Кибернетики

Кафедра Компьютерных Систем и Программных Технологий

ОТЧЕТ

о выполнении научно-исследовательской работе

по дисциплине "Операционные системы и среды"

IPC микроядра на примере QNX Neutrino:

                              Работу выполнила студентка группы 4081/1   

Преподаватель                                                 

Санкт-Петербург

2011

1.Передача сообщений (функции send, receive, reply)

ConnectAttach() – соединяет процесс с каналом

int ConnectAttach( uint32_t nd,  pid_t pid, int chid, unsigned index, int flags );

MsgReply  Ответ сообщением

int MsgReply( int rcvid,  int status,  const void* msg, int size );

rcvid          ID, возвращенное MsgReceive*() при получении сообщения

MsgReceive  Ожидание сообщения из канала

int MsgReceive( int chid, void * msg, int bytes,  struct _msg_info * info );

chid            ID канала, установленное ChannelCreate().

MsgSend Отправка сообщения в канал

int MsgSend( int coid, const void* smsg, int sbytes, void* rmsg, int rbytes );

coid            The ID канала, куда посылается, установленное ConnectAttach().

1.1. междуродственнымипроцессами,

client:

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#include <stdlib.h>

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

{    

int   coid;

int   status;

int pid=getppid();

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);

}

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>

#include <stdio.h>

#include <stddef.h>

#include <process.h>

int main (void)

{

int   rcvid, chid, pid, ppid;

char  receive_buf[25], reply_buf[25];

chid=ChannelCreate(0);

pid=getpid();

ppid=getppid();

printf("\n\n FATHER PARAM: pid=%d  ppid=%d\n", pid, ppid);

if(fork()==0)   execl("client", "client", NULL);

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;

}

Результаты:

# ./server&

[1] 761907

# FATHER PARAM: pid=761907  ppid=606258

761907

CLIENT: I send [Client: Answer]

SERVER: I receive [Client: Answer]

SERVER: I reply [Answer]

Pr : "Answer"

End Client

Для посылки сообщения используется идентификатор процесса-родителя (сервера).

Сначала клиент отправляет сообщение, затем сервер его получает и отвечает клиенту. Клиент принимает ответ и заканчивает свою работу.

               1.2. потоками одного процесса,

В качестве клиента выступает второй поток, а сервер это первый поток. Связь осуществляется посредством общего идентификатора процесса.

#include <pthread.h>

#include <stdio.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#include <stdlib.h>

#include <stddef.h>

#include <process.h>

pthread_t t1, t2;

void* thread1( void* );

void* thread2( void* );

int main()

{

pthread_create( &t1, NULL, thread1, NULL );

pthread_create( &t2, NULL, thread2, NULL );

pthread_join( t1, NULL );

pthread_join( t2, NULL );

return;

}

void *thread2( void *t )

{

int      coid;

int   status;

int pid=getpid();

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);

int   coid;

int   status;

int pid=getppid();

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");

Похожие материалы

Информация о работе