Использованные функции:
#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.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:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.