Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СистПриклПрогЗабез(Хихловская).doc
Скачиваний:
28
Добавлен:
10.02.2016
Размер:
961.02 Кб
Скачать

Пример приложения клиент-сервер, использующего fifo для обмена данными. Клиент посылает серверу сообщенияHello, а сервер выводит это сообщение на терминал.

Клиент:

#include <sys/types.h>

#include <fcntl.h>

# include <sys/std.h>

/*Соглашение об имени FIFO*/

# define FIFO fifo.1

main()

{

int writefd, n;

/*Получим доступ к FIFO*/

if ((writefd=open(fIFO,O_WRONLY))<0){

printf(Невозможно открыть FIFO\n); exit(1);}

/*Передадим сообщение серверу FIFO*/

if (write(writefd, Здравствуй,Мир!\n,18)!=18){

printf(Ошибка записи\n); exit(1);}

/*Закроем FIFO*/

close (writefd);

/*Удалим FIFO*/

if (unlink(FIFO)<0){

printf(Невозможно удалить FIFO\n); exit (1); }

exit(0);

}

Сервер:

#include <sys/types.h>

#include <fcntl.h>

#include <sys/stat.h>

#define FIFO fifo.1

#define MAXBUFF

main

main ()

{

int readfd, n;

char buff[MAXBUFF]; /*буфер для чтения данных из FIFO*/

/*Создадим специальный файл FIFO с открытыми для всех правами доступа на чтение и запись*/

if (_mknod(FIFO,S_IFIFO|0666,0)<0){

printf(Невозможно создать FIFO\n); exit(1); }

/*Получим доступ к FIFO*/

if ((readfd=open(FIFO,O_RDONLY))<0){

printf(Невозможно открыть FIFO\n); exit(1);}

/*Прочитаем сообщение (Здравствуй,Мир!) и выведем его на экран*/

while ((n=readfd,buff,MAXBUFF))>0)

if(write (1,buff,n)!=n){

printf(Ошибка вывода \n); exit (1); }

/*Закроем FIFO, удаление FIFO – дело клиента*/

close (readfd);

exit(0);

}

Права доступа к объекту

Значение ,,,,, в 8-ричн.

Аналог прав доступа для файлов

Разрешено

0400

z - - - - - - - -

Чтение для владельца

0200

- w - - - - - - -

Запиь для владельца

0040

- - - z - - - - -

Чтение для вл. группы

0020

- - - - w - - - -

Запись для вл. группы

0004

- - - - - - z - -

Чтение для всех ост.

0002

- - - - - - - w -

Запись для всех ост.

Идентификаторы и имена в ipc

Как было показано, отсутствие имен у каналов делает их недоступными для независимых процессов. FIFO имеют имена. Другие средства межпроцессного взаимодействия требуют дополнительных соглашений по именам и идентификаторам. Множество возможных имен объектов конкретного типа межпроцессного взаимодействия называется пространством имен ( name space). Имена являются важным компонентом системы межпроцессного взаимодействия для всех объектов, кроме каналов, т.к. позволяют процессам получить доступ к общему объекту. Именем FIFO, является имя файла именованного канала. Используя условное имя созданного FIFO два процесса могут обращаться к этому объекту для обмена данными.

Для таких объектов IPC, как очереди сообщений, семафоры и разделяемая память, процесс назначения имени более сложен, чем просто указание имени файла. Имя для этих объектов называется ключом (key) и генерируется функцией ftok(3c) из двух компонентов – имени файла и идентификатора проекта:

# include <sys/types.h>

# include <sys/ipc.h>

key –t ftok (char *filename, char proj);

В качестве filenameможно использовать имя некоторого файла, известное взаимодействующим процессам, например, имя программы-сервера. Главное, чтобы этот файл существовал на момент создания ключа. Нежелательно использовать имя файла, который создается и удаляется в процессе работы распределенного приложения, т.к. при генерации ключа используется номер inode файла. Вновь созданный файл может иметь другой inode и впоследствии процесс, желающий иметь доступ к объекту, получит неверный ключ.

Пространство имен позволяет создать и совместно использовать IPC неродственным объектам.

Каждое IPC имеет свой уникальный дескриптор (идентификатор), используемый ядром ОС для работы с объектом. Уникальность дескриптора обеспечивается уникальностью дескрипторов для каждого из типов объектов (очереди сообщений, семафоры и разделяемая память).

Идентификация объектов выполняется в соответствии с табл.

Таблица . Идентификация объектов IPC

Объект IPC

Пространство имен

Дескриптор

Канал

Файловый дескриптор

FIFO

Имя файла

Файловый дескриптор

Очередь сообщений

Ключ

Идентификатор

Семафор

Ключ

Идентификатор

Разделяемая память

Ключ

Идентификатор

  1. СООБЩЕНИЯ

Внутренний, связанный список процессов в порядке их поступления, который в виде очереди хранится в адресном пространстве ядра. Для каждой очереди ядро создает заголовок msgid_ds, где содержится информация оправах доступа к очереди, ее текущем состоянии на первое и последнее сообщения. Каждый элемент очереди является отдельным сообщением.

  1. СЕМАФОРЫ

Используются для синхронизации доступа нескольких процессов к разделяемым ресурсам. Разрешают или запрещают доступ к разделяемому ресурсу.

Семафоры являются системным ресурсом, действия над которыми производятся через интерфейс системных вызовов.

Семафоры хранятся в адресном пространстве ядра.

  1. РАЗДЕЛЯЕМАЯ ПАМЯТЬ

Этот механизм позволяет двум процессам использовать для обмена общий участок памяти, куда информация будет попадать и считываться минуя ядро. Задача кооперативного использования памяти, при этом, решается при помощи семафоров.

  1. СОКЕТЫ

Для реализации межпроцессорного взаимодействия между процессами, которые выполняются на разных компьютерах сети которые могут иметь различные схемы адресации объектов, их расположение, протоколы передачи данных и т.д.

Для коммутационного узла, обеспечивающего прием и передачу данных для объекта (процесса) предложен специальный объект – сокет (socket), который создается в рамках коммутационного домена (communication domain) и адресуется своим дескриптором.

Сокет – виртуальный объект. Он существует, пока в нем есть необходимость.

Реализованы основные виды сокетов:

– сокет датаграмм (datagram socket) – осуществляет теоретически ненадежную, несвязную передачу пакетов;

– сокет потока (stream socket) – осуществляет надежную передачу потока байтов, без сохранения границ сообщений. Используется для передачи экстренных сообщений;

– сокет пактов (packet socket) – выполняет надежную передачу потока данных без дублирования с предварительным установлением связи. При использовании, сохраняются границы сообщений;

– сокет низкого уровня (raw socket) – такой сокет позволяет осуществить непосредственный доступ к коммуникационному протоколу.

Другие интерфейсы к коммуникационным протоколам

В UNIX в качестве интерфейса к TCP/IPв основном используются следующиеAPI:

  1. сокеты Беркли;

  2. транспортный интерфейс XTI (X/Open Transport Interface);

Интерфейс XTIявляется расширением к транспортному протоколуTLI(XTI/TLI)-TransportLayerInterface.Он задумывался как интерфейс, не зависящий от протокола, так как он легко поддерживал новые протоколыOSI, которые, как считалось, придут на сменуTCP/IP. Имена функцийTLIпохожи на используемые вAPIсокетов, но начинаются сt_. Но их семантика кардинально отличается в ряде случаев. Этот протокол используется в системах фирмыNOVELL, а также поставляются вOCUNIX. ПротоколыXTIназывается интерфейсом наряду с интерфейсом сокетов, так как это всего лишь доступ к стекуTCP/IP, так как коммуникационные протоколы реализуются стеком протоколов, также имеет значение, какойAPIиспользует клиент. Приложение с использованием сокетов, может обмениваться данными с приложением на базеXTI.В системахSVR4 оба интерфейса обычно реализуются в виде библиотек. ДостоинствомXTI/TLI является возможность с его помощью добавить новый протокол, не имея доступа к ядру, причём достаточно просто.

Тем не менее есть примеры реализации с помощью сокетов простого, не зависящего от протокола сервера времени дня, который поддерживает IPверсий 4 и 6, и сокеты в адресном доменеUNIX. Существует спор, какие из интерфейсов более производительны, но они одинаковы.

Большое преимущество сокетов –переносимость - на MsWin.Сокеты проще используются, и их рекомендуется преимущественно использоватьSVR4 иSVR6-протоколыIP, позволяющие пересылать в пакете 4 или 6 байтов.

Solaris-это SVR4 фирмы SUN.