Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SysSoft.doc
Скачиваний:
523
Добавлен:
16.03.2016
Размер:
4.36 Mб
Скачать

Программные каналы

Мы с вами уже знакомились с программными каналами в главе 6. Однако рассмотрим этот механизм ещё раз, так сказать в его исходном, изначальном толковании.

Программные каналы (pipes) в ОСUNIXявляются очень важным средством взаимодействия и синхронизации процессов. Теоретически программный канал позволяет взаимодействовать любому числу процессов, обеспечивая дисциплинуFIFO(first-in-first-out). Другими словами, процесс, читающий из программного канала, прочитает самые давние записанные в программный канал данные. В традиционной реализации программных каналов для хранения данных использова­лись файлы. В современных версиях ОСUNIXдля реализации программных ка­налов применяются другие средстваIPC(в частности, очереди сообщений).

В UNIXразличаются два вида программных каналов – именованные и неимено­ванные. Именованный программный канал может служить для общения и синхронизации произвольных процессов, знающих имя данного программного кана­ла и имеющих соответствующие права доступа. Неименованным программным каналом могут пользоваться только создавший его процесс и его потомки (необязательно прямые).

Для создания именованного программного канала (или получения к нему досту­па) используется обычный файловый системный вызов open. Для создания же неименованного программного канала существует специальный системный вы­зовpipe(исторически более ранний). Однако после получения соответствующих дескрипторов оба вида программных каналов используются единообразно с по­мощью стандартных файловых системных вызововread,writeиclose.

Системный вызов pipeимеет следующий синтаксис:

plpe(fdptr);

где fdptr– это указатель на массив из двух целых чисел, в который после создания неименованного программного канала будут помещены дескрипторы, предназначенные для чтения из программного канала (с помощью системного вызоваread) и записи в программный канал (с помощью системного вызоваwrite). Дескрипторы неименованного программного канала – это обычные дескрипторы файлов, то есть такому программному каналу соответствуют два элемента табли­цы открытых файлов процесса. Поэтому при последующем использовании сис­темных вызововreadиwriteпроцесс совершенно не обязан отличать случай ис­пользования программных каналов от случая использования обычных файлов (собственно, на этом и основана идея перенаправления ввода/вывода и организа­ции конвейеров).

Для создания именованных программных каналов (или получения доступа к уже существующим каналам) используется обычный системный вызов open. Основным отличием от случая открытия обычного файла является то, что если именованный программный канал открывается на запись и ни один процесс не открыл тот же программный канал для чтения, то обращающийся процесс бло­кируется до тех пор, пока некоторый процесс не откроет данный программный канал для чтения. Аналогично обрабатывается открытие для чтения.

Запись данных в программный канал и чтение данных из программного канала (независимо от того, именованный он или неименованный) выполняются с помощью системных вызовов readиwrite. Отличие от случая использования обычных файлов состоит лишь в том, что при записи данные помещаются в начало канала, а при чтении выбираются (освобождая соответствующую область памя­ти) из конца канала.

Окончание работы процесса с программным каналом (независимо от того, име­нованный он или неименованный) производится с помощью системного вызова close.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]