Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб3.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
46.9 Кб
Скачать
      1. Передача сообщений между родственными процессами

Листинг 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

      1. Передача сообщений между потоками одного процесса

Листинг 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