Каждый процесс имеет свою собственную таблицу дескрипторов файлов. Файловый дескриптор 4 в процессе 1234 указывает внутри таблицы процесса 1234. Файловый дескриптор 4 в процессе 5678 указывает внутри таблицы процесса 5678. Случай, с которым вы должны быть знакомы, - это файловые дескрипторы 0, 1 и 2, которые для каждого процесса представляют собой стандартный ввод, стандартный вывод и стандартную ошибку, указывающие, куда они были перенаправлены.
Процесс может открыть один и тот же файл более одного раза. Это может происходить по совпадению, например, когда стандартный вывод процесса и стандартная ошибка перенаправляются на один и тот же терминал или в один и тот же файл. Базовые записи таблицы файлов (например, Linuxstruct file
) несут больше информации о файле; они также содержат режимы открытия (например, чтение или запись) и другое состояние (например, флаги, например, close-on-exec). Например, процесс может иметь терминал, открытый для чтения только по файловому дескриптору 0, и тот же терминал, открытый для записи только по файловому дескриптору 2. Записи файловых таблиц также содержат позицию процесса в файле; процесс может захотеть использовать lseek
две разные позиции в одном и том же файле, и поэтому он будет использовать dup
для получения двух дескрипторов этого файла.
4
в обоих процессах относительно его собственного числа открытых fd. Fd0-2
(stdin, stdout, sdterr) всегда открываются для нового процесса, а номера не зарезервированы только для этого процесса.