Системный вызов |
Описание |
MsgSend() |
Отправка сообщения. Переход потока в блокированное состояние пока не придет ответ. |
MsgReceive() |
Ожидание сообщения и его прием. Поток находится в блокированном состоянии пока сообщение не пришло. |
MsgReply() |
Посылка ответного сообщения отправителю по его идентификатору. Ответ нужен, чтобы разблокировать отправителя. |
Так же существуют и другие функции для обмена сообщениями, например, для обмена векторными сообщениями, стоящими из нескольких частей.
Пример с исходным кодом будет рассмотрен далее (пример совместный с пульсами).
При обмене сообщениями между родственными потоками не обязательно регистрировать имя для обмена сообщениями. Для этого можно использовать следующие вызовы.
Системный вызов |
Описание |
ChannelCreate() |
Создать канал для приема сообщений |
ChannelDestroy() |
Уничтожить канал |
ConnectAttach() |
Создать соединение для передачи сообщения |
ConnectDetach() |
Уничтожить соединение |
2.1. Передача сообщений между родственными процессами.
Листинг 2.1. 2_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 channelId; // Идентификатор канала
int main(int argc, char *argv[])
{
char receiveBuff[256],
replyBuff[256];
int rcvId;
// Cоздание канала //
channelId = ChannelCreate(0);
pid_t child_pid = fork();
if (child_pid == -1) {
printf( "Create process error!\n" );
exit(1);
}
else if (child_pid == 0) {
// Процесс-потомок //
int connectId;
char sendBuff[256],
replyBuff[256];
pid_t pid = getppid();
// Создать соединение //
connectId = ConnectAttach( 0, pid, channelId, 0, 0 );
// Передача сообщения //
strcpy( sendBuff, "Msg example");
MsgSend( connectId, sendBuff, sizeof(sendBuff), replyBuff, sizeof(replyBuff) );
printf ( "Client: message <%s> received \n", replyBuff );
// Уничтожить соединение //
ConnectDetach( connectId );
return EXIT_SUCCESS;
}
// Прием сообщения //
rcvId = MsgReceive(channelId, receiveBuff, sizeof(receiveBuff), NULL);
printf ( "Server: message <%s> received \n", receiveBuff );
strcpy(replyBuff, "Msg from Server. OK!");
// Передача ответа //
MsgReply( rcvId, EOK, replyBuff, sizeof(replyBuff) );
ChannelDestroy( channelId );
return EXIT_SUCCESS;
}
Результаты работы:
Программы запускались прямо из IDE(Run As C/C++ QNX Application). Результаты работы выводятся на консоль в IDE.
Server: message <Msg example> received
Client: message <Msg from Server. OK!> received
2.2. Передача сообщений между потоками одного процсса.
Листинг 2.2. 2_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 channelId; // Идентификатор канала
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оздание канала //
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.