Обмен сообщениями и импульсами в ОС QNX. Обмен сообщениями при стандартной организации модели "клиент-сервер", управляемой по запросу, страница 5

Использованные функции:

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int open( const char * path,

int oflag,

mode_t ); - открытие файла

 


#include <unistd.h>

int close( int filedes ); - закрытие файла

ssize_t read( int fildes,

void* buf,

size_t nbyte ); - считывание nbyte байтов из файла

ssize_t write( int fildes,

const void* buf,

size_t nbyte ); - запись nbyte байтов в файл

Результат выполнения программ представлен на рис. 1.9.

Рис. 1.9. Результат выполнения программ

При записи и считывании следует указать имя файла, с которым будет производиться работа. Если в программе write будет обнаружено, что файл не существует, он будет создан.

Как видно из рисунка, информация была успешно записана и считана из файла.

Чтобы получить доступ к файлу на каком-нибудь узле сети qnet, следует указать путь, который определяется следующим образом:

/net/имя_узла/путь_до_файла_на_другом_компьютере

Рассмотрим изменённые варианты программ для демонстрации такой возможности.

Программа write_net.c:

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

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

int fd = open (argv[1], O_WRONLY | O_CREAT);

char str[50];

sprintf(str, "chmod 755 %s", argv[1]);

system(str);

write(fd, argv[2], sizeof(argv[2]));

close(fd);

return EXIT_SUCCESS;

}

После создания файла следует установить права доступа к нему, позволяющие осуществлять запись информации. Вторым аргументом при запуске программы write передаётся сохраняемая строка.

Результаты выполнения программ представлены на рис. 1.10.

1.bmp

Рис. 1.10. Запись и чтение информации из файла, находящегося на другом узле сети

Запуск программ осуществлялся на компьютере SPOcomp10. Все манипуляции производились с файлом на другом компьютере сети - SPOcomp11. Информация была успешно записана и считана.

2.  Обмен импульсами

Механизм, который обеспечивает отправку сообщения без блокирования, называют «импульсом» (pulse). Импульс - это миниатюрное сообщение, которое

-  может перенести 40 бит полезной информации (8-битный код и 32 бита данных),

-  является неблокирующим для отправителя,

-  может быть получено точно так же, как и сообщение другого типа,

-  ставится в очередь, если получатель не заблокирован в ожидании сообщения.

Импульсы могут быть отправлены с помощью двух функций:

MsgSendPulse(),

MsgDeliverEvent()

Импульс можно принять с помощью функции MsgReceive(), как будто поток отправил обычное стандартное сообщение. При этом на импульс нельзя будет ответить с помощью функции MsgReply(), а идентификатор отправителя будет равен нулю.

Функция MsgReceive() принимает как импульсы, так и сообщения. Если необходимо принимать только импульсы, для этого существует функция MsgReceivePulse().

Функция MsgDeliverEvent() служит для доставки события от сервера клиенту через структуру sigevent. Сначала клиент создаёт структуру и заполняет её, затем посылает сообщение, включающее её в себя. Сервер принимает сообщение, сохраняет структуру sigevent и идентификатор отправителя и немедленно отвечает клиенту. Теперь клиент и сервер могут выполняться. Когда сервер завершает обработку сообщения, он уведомляет об этом клиента через функцию MsgDeliverEvent(). В таком случае исключается взаимная блокировка процессов.

2.1.   Использование MsgSend/MsgSendPulse на стороне клиента и MsgReceive/MsgReceivePulseна стороне сервера

Программа server3.c: