Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 57
Текст из файла (страница 57)
Для этого пользователи объединяют две программы в конвейер при помощи оператора 1 ' В традиционных системах, например в БУй2, программные каналы реализованы в файловой системе. Они используют поля блоков прямой алресации в индексных лескрипторах файлов (1поде, см. раздел 9,2.2) для размепгения блоков данных в канале. Это ограничивает размер конвейера до десяти блоков. В современных системах 111Ч1Х остается такое ограничение несмотря на то, что реализация каналов в них иная.
6.2. Универсальные средства!РС 241 С точки зрения межпроцессного взаимодействия программные каналы являются эффективным способом передачи данных от одного процесса дру- гому. Однако они обладают несколькими ограничениями: + так как чтение данных из канала приводит к их удалению, он не может быть использован для щироковещательной передачи информации нескольким адресатам; + данные канала интерпретируются как поток байтов, границы сообщения заранее не известны. Если отправитель посылает через канал несколько объектов различной длины, получатель не имеет возможности определять, как много объектов ему было передано, он также не знает, где заканчивается один объект и начинается другой', + когда данные из канала считываются несколькими процессами, отправитель не в состоянии передать данные какому-то определенному получателю.
Точно так же при наличии нескольких отправителей не существует способа определения, какой из них отослал данные'. Реализация программных каналов может быть осуществлена различными способами. В традиционных вариантах (например, в БЪ'К2) для этого приме- няются механизмы файловой системы и ассоциация индексного дескриптора файла ((поде) и элемента таблицы файлов для каждого канала. Во многих реализациях системы, основанных на ВЯ), применяются сокеты. В ОС БЪ'К4 используются двунаправленные каналы БТКЕАМ8, которые будут описаны подробнее в следующем разделе.
В ОС Бузсет 'тг 1))х11Х и других коммерческих вариантах 1)Х1Х представ- лены файлы ЛгО, называемые также имегговаппыми каналами (пащег) р(ре). Они отличаются от обычных неименованных каналов способами создания и доступа. Пользователь создает файл НРО при помощи системного вызова шалой, передавая ему имя файла и режим его создания. Поле режима описы- вает тип файла 3 1Р1ГО и обычные правила доступа к нему. После этого процесс, обладающий соответствующими полномочиями, может откры- вать файл Р1ГО и производить с ним операции чтения и записи. Семанти- ка чтения-записи для файлов НРО похожа на аналогичные операции над программными неименованными каналами и будет более подробно описана в разделе 8.4,2.
Файл Р1РО существует до тех пор, пока не будет отсоединен принудительно, даже если у него не останется ни одного активного отправи- теля или получателя. Файлы НГО обладают несколькими преимуществами по сравнению с про- граммными каналами. Такие файлы могут быть доступны любым процессам. ' Взаимодействуюшие приложения могут договориться о протоколе, опиеываюшем границы пакета информации в каждом обьекте. г Еше раз повторим, что приложения могут определить соглашение по маркировке источника данных каждого объекта.
242 глава 6. Межпроцессное взаимодействие Они являются постоянными и, следовательно, могут быть использованы для хранения данных пользователей, уже не активных в системе. Они обладают определенным именем в пространстве имен файловой системы. Конечно, файлы НгО имеют и некоторые недостатки. По завершении использования их необходимо удалять принудительно.
Они менее защищены по сравнению с программными каналами, так как к ним может обращаться любой процесс, обладающий достаточными привилегиями. Программные каналы проще в создании и требуют меньшего количества ресурсов. 6.2.3. Каналы в системе 8ЧВ4 В системе БЪ'К4 как базовое средство работы с сетями и реализации каналов и 41айлов НгО применяются 5ТКГАМ5 (см. главу 17). Это дает возможность предоставления системой новых полезных средств конвейеризации'. В этом разделе будут описаны только новые возможности каналов.
Детали их организации обсуждаются в разделе 17.9. В системе 5Ъ'К4 каналы двунаправлены. Вызов р]ре возвращает, как и ранее, два дескриптора, однако теперь они оба открыты как для чтения, так и для записи. Синтаксис вызова (совпадающий с традиционным) приведен ниже: з1асцз = р1ре(!п1 Т11цезг2]); В 5'тгК4 вызов р1ре создает два независимых канала ввода-вывода, работающих по принципу «первым вошел, первым вышел» и представленных двумя дескрипторами.
Данные, записанные в ЙЫез[1), могут быть прочитаны из ВЫез[0), а данные, записанные в ВЫез[0), могут быть прочитаны из ВЫез[1). Такой подход является очень удобным, поскольку многие приложения требуют от системы возможности двухсторонних коммуникаций, для чего в предгядущих версиях 5Ъ'К необходимо было открывать два отдельных канала Операционная система 5'ьгК4 может позволить процессу присоединить к объекту файловой системы любой дескриптор 4>айда 5ТК6АМ5 [10).
Приложение создает канал посредством вызова р]ре и затем связывает его дескрипторы с именем файла при помощи конструкции зса1цз - ТаС1аспыпт 111г)ез, сваг *расп); где раси — путь к объекту файловой системы, обладателем которого является вызывающий процесс'.
Такой объект может быть обычным файлом, каталогом или специальным файлом. Он не может быть точкой монтирования (то есть на него пе должна монтироваться файловая система) илн объектом удаленной файловой системы. Он также не присоединяется к другому дескрнп- ' Новые средства представлены только лля программнык каналов. Реализация файлов Р1РО в ОС о'т'й«почти совпадает с традиционной.
з В ином случае вызывакиций процесс должен являться привилегированным. б.2. Универсальные средства!РС 243 тору файла 51кЕАМ5. Существует возможность связать дескриптор с несколькими путями, ассоциируя с ними несколько имен. После присоединения все последующие операции над ратЬ будут на самом деле производиться над файлом 51КЕАМ5 до тех тор, пока дескриптор не будет отключен от раЬЬ через вызов Ыегасй.
Используя описанную возможность, процесс может создавать канал и затем дать доступ к нему другим процессам системы. Пользователь может поместить модули 51йсАМ5 в канал или файл Е1ЕО. Такие модули перехватывают проходящие через канал данные и производят над ними различные действия. Так как эти модули функционируют внутри ядра системы, они умеют выполнять действия, недоступные пользовательским приложениям. Только привилегированные пользователи обладают правом добавлять в систему модули, но всем пользователям доступна возможность помещения модулей в открытые ими потоки.
6.2.4. Трассировка процессов Системный вызов рггасе предлагает базовый набор средств трассировки процессов. Обычно он применяется различными отладчиками, например аоЬ или йх. При помощи ргтасе процесс может управлять выполнением своего потомка. Он может контролировать и несколько потомков сразу, но такое редко применяется на практике. Синтаксис ргтасе следующий: рГгасе 1сес', р1с, ассг. бата); где рЫ вЂ” идентификатор трассируемого процесса, адбт — ссылка на его адресное пространство.
Интерпретация аргумента сага зависит от се~а. Аргумент св6 позволяет процессу-предку осуществлять следующие действия: + записывать или считывать слово из адресного пространства потомка; + записывать или считывать слово из области а потомка; + считывать или писать в общецелевые регистры потомка; + перехватывать определенные сигналы. Если перехватываемый сигнал генерируется для потомка, ядро приостановит его работу и уведомит его предка о возникновении события; + устанавливать или удалять точки наблюдения в адресном пространстве потомка; + возобновлять выполнение приостановленного потомка; + осуществлять пошаговое выполнение потомка: прервать его работу, затем позволить ему выполнить одну инструкцию, после чего снова приостановить его функционирование; + завершить работу потомка.
244 Глава 6. Межпроцессное взаимодействие Одна из команд (сшг1 0) зарезервирована для потомка. Она применяется для информирования ядра системы о том, что потомок будет подвергнут трассировке своим предком. После этого ядро устанавливает для него флаг ?гасео (в структуре ргос), который влияет на обработку потомком сигналов, Если сигнал генерируется для трассируемого процесса, ядро приостанавливает его выполнение и уведогиляет об этом его процесс-предок при помощи сигнала 516СНЮ (вместо загрузки обработчика сигнала). Это позволяет родительскому процессу перехватить сигнал и произвести соответствующие действия, Флаг ггасе6 также изменяет выполнение системного вызова ехес.