Факультет Технической Кибернетики
Кафедра Компьютерных Систем и Программных Технологий
ОТЧЕТ
о выполнении научно-исследовательской работе
по дисциплине "Операционные системы и среды"
IPC микроядра на примере QNX Neutrino:
Преподаватель
Санкт-Петербург
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");
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.