Скажем, у меня есть процесс 1 и процесс 2 . Оба имеют дескриптор файла, соответствующий целому числу 4.
Однако в каждом процессе дескриптор файла 4 указывает на совершенно другой файл в таблице открытых файлов ядра:
Как это возможно? Разве файловый дескриптор не должен быть индексом записи в таблице открытых файлов?
kernel
open-files
file-descriptors
Pithikos
источник
источник
4
в обоих процессах относительно его собственного числа открытых fd. Fd0-2
(stdin, stdout, sdterr) всегда открываются для нового процесса, а номера не зарезервированы только для этого процесса.Ответы:
Файловый дескриптор, т. Е.
4
В вашем примере, является индексом таблицы дескрипторов файлов для конкретного процесса , а не таблицы открытых файлов. Сама запись дескриптора файла содержит индекс к записи в глобальной таблице открытых файлов ядра, а также флаги дескриптора файла.источник
Каждый процесс имеет свою собственную таблицу дескрипторов файлов. Файловый дескриптор 4 в процессе 1234 указывает внутри таблицы процесса 1234. Файловый дескриптор 4 в процессе 5678 указывает внутри таблицы процесса 5678. Случай, с которым вы должны быть знакомы, - это файловые дескрипторы 0, 1 и 2, которые для каждого процесса представляют собой стандартный ввод, стандартный вывод и стандартную ошибку, указывающие, куда они были перенаправлены.
Процесс может открыть один и тот же файл более одного раза. Это может происходить по совпадению, например, когда стандартный вывод процесса и стандартная ошибка перенаправляются на один и тот же терминал или в один и тот же файл. Базовые записи таблицы файлов (например, Linux
struct file
) несут больше информации о файле; они также содержат режимы открытия (например, чтение или запись) и другое состояние (например, флаги, например, close-on-exec). Например, процесс может иметь терминал, открытый для чтения только по файловому дескриптору 0, и тот же терминал, открытый для записи только по файловому дескриптору 2. Записи файловых таблиц также содержат позицию процесса в файле; процесс может захотеть использоватьlseek
две разные позиции в одном и том же файле, и поэтому он будет использоватьdup
для получения двух дескрипторов этого файла.источник
dup
в точности соответствует тому, что написано на банке: оба результирующих дескриптора указывают на одну и ту же запись таблицы файлов и, таким образом, имеют одинаковое смещение. Для того, чтобы получить 2 разных записи в таблице файлов, я уверен, что вам нуженopen
файл дважды.Каждый процесс имеет свою собственную таблицу дескрипторов файлов. Вот и все.
Все это очень хорошо описано в сетевом программировании UNIX Ричарда Стивенса, если вы хотите глубоко изучить его.
источник
Разве дополнительный уровень косвенности не решит вашу проблему? («Все проблемы в компьютерном программировании могут быть решены с помощью дополнительного уровня косвенности», - считает один мудрый седобородый). То есть маленькое целое число в каждом процессе заканчивается как индекс в массиве индексов пространства ядра для каждого процесса в «Таблицу открытых файлов».
источник