- •Лабораторная работа №3
- •Цель работы
- •Выполнение
- •Сигналы
- •Сообщения
- •Передача сообщений между родственными процессами
- •Передача сообщений между потоками одного процесса
- •Передача сообщений между независимыми процессами (неименованные каналы)
- •Передача сообщений между независимыми процессами (именованные каналы)
Передача сообщений между родственными процессами
Листинг 2.1. related_processes_msg.c.
/*
* Обмен сообщениями между родственными процессами
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <errno.h>
#include <sys/neutrino.h>
int chid; // Идентификатор канала
int main(int argc, char *argv[])
{
char receiveBuff[256], replyBuff[256];
int rcvid;
// Cоздание канала //
chid = ChannelCreate(0);
pid_t child_pid = fork();
if (child_pid == -1) {
printf( "Create process error!\n" );
exit(1);
}
else if (child_pid == 0) {
// Процесс-потомок //
int coid;
char sendBuff[256], replyBuff[256];
pid_t pid = getppid(); // Получение PID родителя
// Создание соединения //
coid = ConnectAttach( 0, pid, chid, 0, 0 );
// Передача сообщения серверу и прием ответа//
strcpy( sendBuff, "It is Msg");
MsgSend( coid, sendBuff, sizeof(sendBuff), replyBuff, sizeof(replyBuff) );
printf ( "Client: message <%s> received \n", replyBuff );
// Уничтожить соединение //
ConnectDetach( coid );
return EXIT_SUCCESS;
}
// Прием сообщения от клиента//
rcvid = MsgReceive(chid, receiveBuff, sizeof(receiveBuff), NULL);
printf ( "Server: message <%s> received \n", receiveBuff );
strcpy(replyBuff, "Msg from Server. OK!");
// Передача ответа клиенту //
MsgReply( rcvid, EOK, replyBuff, sizeof(replyBuff) );
ChannelDestroy( chid ); // Уничтожение канала
return EXIT_SUCCESS;
}
Результаты работы:
Server: message <It is Msg> received
Client: message <Msg from Server. OK!> received
Передача сообщений между потоками одного процесса
Листинг 2.2. threads_msg.c
/*
* Обмен сообщениями между потоками одного процесса
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <errno.h>
#include <sys/neutrino.h>
void* server( void* );
void* client( void* );
int chid; // Идентификатор канала
int main(int argc, char *argv[])
{
pthread_t serverTid, clientTid; // Дескрипторы потоков
// Создание потоков
pthread_create( &serverTid, NULL, server, NULL );
pthread_create( &clientTid, NULL, client, NULL );
pthread_join( clientTid, NULL );
return EXIT_SUCCESS;
}
// Поток сервера //
void* server( void* param )
{
char receiveBuff[256], replyBuff[256];
int rcvid;
// Cоздание канала //
chid = ChannelCreate(0);
sleep(1);
// Прием сообщения от клиента //
rcvid = MsgReceive(chid, receiveBuff, sizeof(receiveBuff), NULL);
printf ( "Server: message <%s> received \n", receiveBuff );
strcpy(replyBuff, "Msg from Server. OK!");
// Передача ответа клиенту //
MsgReply( rcvid, EOK, replyBuff, sizeof(replyBuff) );
ChannelDestroy( chid );
pthread_exit(NULL);
}
// Потоки клиентов //
void* client( void* param )
{
int coid;
char sendBuff[256], replyBuff[256];
pid_t pid = getpid();
// Создать соединение //
coid = ConnectAttach( 0, pid, chid, 0, 0 );
// Передача сообщения серверу и получение ответа //
strcpy( sendBuff, "It is Msg");
if(MsgSend( coid, sendBuff, sizeof(sendBuff), replyBuff, sizeof(replyBuff))==-1)
{
printf("Error 2\n");
exit(1);
}
printf ( "Client: message <%s> received \n", replyBuff );
// Уничтожить соединение //
ConnectDetach( coid );
pthread_exit( NULL );
}
Результаты работы:
Server: message <It is Msg> received
Client: message <Msg from Server. OK!> received
