Таблицы системных файлов Unix

Я запутался в таблицах системных файлов Unix.

  • Когда два или несколько процессов открывают файл для чтения, создает ли таблица системных файлов отдельные записи для каждого процесса или одной записи?

  • Если для нескольких процессов, открывающих один и тот же файл, создается одна запись, будут ли их смещения файлов одинаковыми?

  • Если process 1 открывает file1.txt для чтения, а process 2 открывает тот же файл file1.txt для записи, будет ли таблица системных файлов создавать одну или две записи?

Ответ 1

Существует три "таблицы системных файлов": Существует таблица дескрипторов файлов, которая отображает дескрипторы файлов (маленькие целые числа) на записи в таблице открытых файлов. Каждая запись в таблице открытых файлов содержит (среди прочего) смещение файла и указатель на таблицу inode в памяти. Вот картинка:
(источник: богатый на www.cs.ucsb.edu)

Таким образом, нет ни одной записи в таблице файлов для открытого файла, и при этом не существует только одной записи на процесс... существует одна запись для вызова open(), и она используется совместно, если дескриптор файла имеет значение dup() ed или fork() ed,

Отвечая на ваши вопросы:

1) Когда два или более процессов открывают файл для чтения, в открытой таблице файлов появляется запись для каждого открытия. Существует даже запись для каждого открытия, если один процесс открывает файл несколько раз.

2) Одна запись не создается в таблице открытых файлов для разных процессов, открывающих один и тот же файл (но в таблице inode в памяти есть только одна запись).

3) Если файл file1.txt открывается дважды, в одном и том же или двух разных процессах, есть две разные записи таблицы открытых файлов (но только одна запись в таблице inode в памяти).

Ответ 2

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

Это из открыть (системный вызов) вики-страницу