Файл является линейным массивом байтов с по крайней мере одним именем. Файл существует до тех пор, пока все его имена не будут явным образом удалены и ни у одного процесса не будет его сохраненного дескриптора. Процесс запрашивает дескриптор для файла, открывая файл по его имени с помощью системного вызова open. Доступ к устройствам ввода/вывода осуществляется, как к файлам.
Канал (pipe) является линейным массивом байтов, как и файл, но он используется исключительно как поток ввода/вывода и является однонаправленным. У него также нет имени, поэтому он не может быть открыт с помощью open. Вместо этого он создается с помощью системного вызова pipe, который возвращает два дескриптора, один из которых принимает ввод, который надежно передается другому дескриптору без повторений и в том же порядке.
Очередь fifo часто называют именованным каналом. Свойства очереди fifo идентичны свойствам канала, за исключением того, что она появляется в файловой системе; таким образом, ее можно открыть с использованием системного вызова open. Два процесса, желающих взаимодействовать друг с другом, каждый открывает по очереди fifo: один открывает для чтения, другой для записи.
Сокет является временным объектом, который используется для межпроцессного взаимодействия; он существует лишь до тех пор, пока какой-нибудь процесс хранит ссылающийся на него дескриптор. Сокет создается с помощью системного вызова socket, который возвращает дескриптор для него. Имеются различные виды сокетов, поддерживающих разную семантику коммуникации, такую, как надежная доставка данных, сохранение порядка сообщений и сохранение рамок сообщения.
Ядро содержит для каждого процесса таблицу дескрипторов, которая используется для преобразования внешнего представления дескриптора во внутреннее. (Дескриптор является просто индексом для этой таблицы.) Таблица дескрипторов процесса наследуется от родителя этого процесса, а вместе с ней наследуется и доступ к объектам, на которые ссылаются дескрипторы. Главными способами получения дескриптора процессом являются следующие. Открывание или создание объекта. Наследование от родительского процесса. К тому же IPC с использованием сокетов допускает передачу дескрипторов в сообщениях между несвязанными процессами на одной и той же машине.
У каждого действительного дескриптора есть связанное с ним смещение файла в байтах от начала объекта. Операции чтения и записи начинаются с этого смещения, которое обновляется после каждой передачи данных. Для объектов, допускающих произвольный доступ, смещение файла может также устанавливаться с помощью системного вызова Iseek. Обычно файлы допускают произвольный доступ, так же как и некоторые устройства. Каналы, очереди fifo и сокеты не допускают произвольного доступа.
Когда процесс завершается, ядро восстанавливает все дескрипторы, которые использовались этим процессом. Если процесс удерживал последнюю ссылку на объект, уведомляется менеджер объекта таким образом, чтобы он смог выполнить любые необходимые действия по очистке, такие, как окончательное удаление файла или освобождение сокета.
Большинство действий, связанных с доставкой сигнала потоку, выполняется в контексте этого потока. Поток проверяет свое поле td_siglist на предмет наличия ожидающих сигналов по крайней мере один раз при входе в систему, вызывая cursigQ.
SLEEPING - Поток заблокирован в ожидании события. Если поток находится в состоянии непрерываемого сна, больше ничего не должно предприниматься. В противном случае ядро может предпринять действие - либо непосредственно, либо косвенно, - пробудив поток. Есть два действия, которые можно применить непосредственно. Для сигналов, вызывающих остановку процесса, все потоки в процессе помещаются в состояние STOPPED и родительский процесс уведомляется об изменении состояния посредством отправки ему сигнала SIGCHLD.
Реализация сигналов разделена на две части, первая из которых - отправка сигнала процессу, а вторая - распознавание сигнала и доставка его потоку назначения. Сигналы может отправлять любой процесс или код, который выполняется на уровне прерывания. Доставка сигнала обычно имеет место в контексте получающего потока. Но когда сигнал форсирует остановку процесса, действие может быть проведено для всех потоков, связанных с этим процессом в тот момент, когда сигнал был отправлен.
Сигналы первоначально были спроектированы для моделирования исключительных событий, таких, как попытка пользователя завершить вышедшую из-под контроля программу. Они не предназначались для использования в качестве общего механизма межпроцессного взаимодействия, поэтому не было сделано попытки сделать их надежными. В более ранних системах каждый раз при перехвате сигнала восстанавливалось его действие по умолчанию.
Описание сигналов указывается для каждого процесса. Если процесс не указал действие на сигнал, ему предоставляется действие по умолчанию которое может быть одним из следующих: