`Close (fd)` уничтожает запись таблицы файлов и / или запись таблицы vnode? - PullRequest
0 голосов
/ 29 августа 2018

в Unix

#include <unistd.h>
int close(int fd);
  • Правильно ли, что close(fd) также должен уничтожить запись в таблице файлов, связанную с fd? Да, даже если есть другой файловый дескриптор, ссылающийся на ту же запись таблицы файлов?

  • Разве close(fd) также уничтожает запись таблицы vnode, связанную с записью таблицы vnode, или не обязательно? Да, даже если есть другая запись в таблице файлов, ссылающаяся на ту же запись таблицы vnode?

Спасибо.

Для "таблицы дескрипторов файла процесса", "таблицы файлов (ядра)", "vnode" см. http://www.cs.rpi.edu/academics/courses/fall04/os/c18/

Примечание: у меня вопрос от APUE. Я на самом деле интересуюсь Linux, но у Linux нет vnode, но есть общая структура inode. Так что для «vnode» еще нужно подать заявку, я должен попросить Unix.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Можно предположить, что следующие функции из стандартной библиотеки: open, read, write, seek и close образуют интерфейс для операционной системы. В этом интерфейсе он поддерживает некоторые структуры данных. Эти структуры данных не представляют интереса для пользователя стандартной библиотеки.

Указанные функции не работают в файловой системе. Следовательно, никакие vnode или inode не модифицируются этими функциями. Они будут работать / изменяться частью файловой системы операционной системы, если такая модификация требуется операциями. Например, запись может потребовать выделения новых блоков на диске, которые должны быть зарегистрированы в inode.

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

Итак: не правильно, что close(fd) также уничтожает запись в таблице файлов, связанную с fd, если под «записью таблицы файлов» вы подразумеваете запись в файловой системе, за исключением, возможно, короткой живые, временные файлы (однако, в зависимости от программного обеспечения файловой системы ОС, они, возможно, никогда не имели записи),

и: нет, close(fd) не не уничтожает «запись таблицы vnode, связанную с записью таблицы vnode» (что в любом случае является странным предложением), если с vnode вы имеете в виду некоторый тип inode.


EDIT:

С учетом материалов вашего курса:

Правильно ли, что close (fd) также должен уничтожить запись таблицы файлов, связанную с fd? Да, даже если есть другой файловый дескриптор, ссылающийся на ту же запись таблицы файлов?

Нет, это не правильно. close уничтожит запись в таблице дескрипторов файла процесса. Таблица файлов ядра должна поддерживать счетчик ссылок (не показанный в ваших материалах курса), и когда он достигает нуля, запись KFT может быть удалена. Таким образом, close вызывает уменьшение только счетчика ссылок в KFT.

close(fd) также уничтожает запись таблицы vnode, связанную с записью таблицы vnode, или не обязательно? Да, даже если есть другая запись в таблице файлов, ссылающаяся на ту же запись таблицы vnode?

Я считаю этот вопрос неуместным или не понимаю его. Нет записи в таблице vnode. В KFT есть только идентификатор vnode. Управление vnodes (т.е. выделение и освобождение хранилища) выходит за рамки вашего курса.

0 голосов
/ 29 августа 2018

close закрывает файл дескриптор . Если этот дескриптор является последним, ссылающимся на соответствующее описание открытого файла , то последний будет закрыт, что может повлечь дополнительные побочные эффекты. Это с точки зрения современного значения Unix с точки зрения Единой спецификации Unix / POSIX.

Я не уверен, что означает vnode; Я предполагаю, что это часть одного исторического Unix и имеет некоторое соответствие, чтобы открыть описания файлов.

...