ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Особенности поведения вызовов read() и write() для pip′аСистемные вызовы read() и write() имеют определенные особенности поведения при работе с pip’ом, связанные с его ограниченным размером, задержками в передаче данных и возможностью блокирования обменивающихся информацией процессов. Организация запрета блокирования этих вызовов для pipe выходит за рамки нашего курса. Будьте внимательны при написании программ, обменивающихся большими объемами информации черезpipe. Помните, что за один раз из pip’а может прочитаться меньше информации, чем вы запрашивали, и за один раз вpipeможет записаться меньше информации, чем вам хотелось бы. Проверяйте значения, возвращаемые вызовами! Одна из особенностей поведения блокирующегося системного вызова read() связана с попыткой чтения из пустого pip′а. Если есть процессы, у которых этот pipe открыт для записи, то системный вызов блокируется и ждет появления информации. Если таких процессов нет, он вернет значение 0 без блокировки процесса. Эта особенность приводит к необходимости закрытияфайлового дескриптора, ассоциированного с входным концом pip′a, в процессе, который будет использоватьpipeдля чтения (close(fd[1]) в процессе-ребенке в программе из раздела «Прогон программы для организации однонаправленной связи между родственными процессами через pipe»). Аналогичной особенностью поведения при отсутствии процессов, у которых pipe открыт для чтения, обладает и системный вызов write(), с чем связана необходимость закрытия файлового дескриптора, ассоциированного с выходным концом pip′a, в процессе, который будет использовать pipe для записи ( close(fd[0] ) в процессе-родителе в той же программе). Необходимо отметить дополнительную особенность системного вызова write при работе с pip’ами и FIFO. Запись информации, размер которой не превышает размер буфера, должна осуществляться атомарно – одним подряд лежащим куском. Таблица 3. 1.Системные вызовы read и write. Особенности поведения при работе с pipe, FIFO и socket
Понятие FIFO. Использование системного вызова mknod() для создания FIFO. Функция mkfifo() Доступ к информации о расположении pip′а в операционной системе и его состоянии может быть осуществлен только через таблицу открытых файлов процесса, создавшего pipe, и через унаследованные от него таблицы открытых файлов процессов-потомков. Поэтому изложенный выше механизм обмена информацией через pipe справедлив лишь для родственных процессов, имеющих общего прародителя, инициировавшего системный вызов pipe(), или для таких процессов и самого прародителя и не может использоваться для потокового общения с другими процессами. В операционной системе UNIX существует возможность использования pip′а для взаимодействия других процессов, но ее реализация достаточно сложна и лежит далеко за пределами наших занятий. Для организации потокового взаимодействия любых процессов в операционной системе UNIX применяется средство связи, получившее название FIFO (от First Input First Output) или именованныйpipe. FIFO во всем подобен pip’у, за одним исключением: данные о расположении FIFO в адресном пространстве ядра и его состоянии процессы могут получать не через родственные связи, а через файловую систему. Для этого при создании именованного pip’а на диске заводится файл специального типа, обращаясь к которому процессы могут получить интересующую их информацию. Для создания FIFO используется системный вызов mknod() или существующая в некоторых версиях UNIX функция mkfifo(). Следует отметить, что при их работе не происходит действительного выделения области адресного пространства операционной системы под именованныйpipe, а только заводится файл-метка, существование которой позволяет осуществить реальную организациюFIFOв памяти при его открытии с помощью уже известного нам ситемного вызоваopen(). После открытия именованныйpipe ведет себя точно так же, как и неименованный. Для дальнейшей работы с ним применяются системные вызовы read(), write() и close(). Время существования FIFO в адресном пространстве ядра операционной системы, как и в случае с pip’ом, не может превышать время жизни последнего из использовавших его процессов. Когда все процессы, работающие с FIFO, закрывают все файловые дескрипторы, ассоциированные с ним, система освобождает ресурсы, выделенные под FIFO. Вся непрочитанная информация теряется. В то же время файл-метка остается на диске и может использоваться для новой реальной организации FIFO в да льнейшем. Не нашли, что искали? Воспользуйтесь поиском:
|