Система ввода/вывода - Файлы каналы очереди и сокеты

Файл является линейным массивом байтов с по крайней мере одним именем. Файл существует до тех пор, пока все его имена не будут явным образом удалены и ни у одного процесса не будет его сохраненного дескриптора. Процесс запрашивает дескриптор для файла, открывая файл по его имени с помощью системного вызова open. Доступ к устройствам ввода/вывода осуществляется, как к файлам.

Канал (pipe) является линейным массивом байтов, как и файл, но он используется исключительно как поток ввода/вывода и является однонаправленным. У него также нет имени, поэтому он не может быть открыт с помощью open. Вместо этого он создается с помощью системного вызова pipe, который возвращает два дескриптора, один из которых принимает ввод, который надежно передается другому дескриптору без повторений и в том же порядке.

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

Сокет является временным объектом, который используется для межпроцессного взаимодействия; он существует лишь до тех пор, пока какой-нибудь процесс хранит ссылающийся на него дескриптор. Сокет создается с помощью системного вызова socket, который возвращает дескриптор для него. Имеются различные виды сокетов, поддерживающих разную семантику коммуникации, такую, как надежная доставка данных, сохранение порядка сообщений и сохранение рамок сообщения.

Ядро содержит для каждого процесса таблицу дескрипторов, которая используется для преобразования внешнего представления дескриптора во внутреннее. (Дескриптор является просто индексом для этой таблицы.) Таблица дескрипторов процесса насле­дуется от родителя этого процесса, а вместе с ней наследуется и доступ к объектам, на которые ссылаются дескрипторы. Главными способами получения дескриптора процессом являются следующие. Открывание или создание объекта. Наследование от родительского процесса. К тому же IPC с использованием сокетов допускает передачу дескрипторов в сооб­щениях между несвязанными процессами на одной и той же машине.
У каждого действительного дескриптора есть связанное с ним смещение файла в байтах от начала объекта. Операции чтения и записи начинаются с этого смещения, которое обновляется после каждой передачи данных. Для объектов, допускающих про­извольный доступ, смещение файла может также устанавливаться с помощью систем­ного вызова Iseek. Обычно файлы допускают произвольный доступ, так же как и неко­торые устройства. Каналы, очереди fifo и сокеты не допускают произвольного доступа.

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

Еще материалы

  • Доставка сигнала потоку -

    Большинство действий, связанных с доставкой сигнала потоку, выполняется в контек­сте этого потока. Поток проверяет свое поле td_siglist на предмет наличия ожидающих сигналов по крайней мере один раз при входе в систему, вызывая cursigQ.

  • Действия psignal в зависимости от состояния потока -

    SLEEPING - Поток заблокирован в ожидании события. Если поток находится в состоянии непрерываемого сна, больше ничего не должно предприни­маться. В противном случае ядро может предпринять действие - либо непосредственно, либо косвенно, - пробудив поток. Есть два дейст­вия, которые можно применить непосредственно. Для сигналов, вызывающих остановку процесса, все потоки в процессе помещаются в состояние STOPPED и родительский процесс уведомляется об из­менении состояния посредством отправки ему сигнала SIGCHLD.

  • Отправка сигнала -

    Реализация сигналов разделена на две части, первая из которых - отправка сигнала процессу, а вторая - распознавание сигнала и доставка его потоку назначения. Сигна­лы может отправлять любой процесс или код, который выполняется на уровне преры­вания. Доставка сигнала обычно имеет место в контексте получающего потока. Но когда сигнал форсирует остановку процесса, действие может быть проведено для всех потоков, связанных с этим процессом в тот момент, когда сигнал был отправлен.

  • История появления сигналов -

    Сигналы первоначально были спроектированы для моделирования исключительных событий, таких, как попытка пользователя завершить вышедшую из-под контроля про­грамму. Они не предназначались для использования в качестве общего механизма меж­процессного взаимодействия, поэтому не было сделано попытки сделать их надежными. В более ранних системах каждый раз при перехвате сигнала восстанавливалось его дей­ствие по умолчанию.

  • Сигналы процессов BSD (Часть 2) -

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