2016-01-20 2 views
0

В linux на разделе ext4 есть фильм, если я открою фильм &, посмотрите его, затем переместите или переименуйте фильм.inode - переместить файл, который уже открыт

После использования предыдущего кеша ему необходимо прочитать больше кеша из исходного файла, а затем он может это сделать.

Вопрос заключается в том:

Как файловая система & инода этого достичь?

ответ

2

Использование rename() файла в той же файловой системе просто изменяет имя, указывающее на индекс. Вы даже можете использовать rename(), чтобы переместить это имя в другой каталог - до тех пор, как он в той же файловой системе:

переименования() функция должна изменить имя файла. Старый аргумент указывает на путь к файлу, который нужно переименовать. Новый аргумент указывает на новый путь к файлу. ...

Обратите внимание, что спецификация POSIX для rename() является гораздо более конкретным, чем C Стандартная rename() спецификации:

7.21.4.2 rename функция

Синопсис

#include <stdio.h> 
int rename(const char *old, const char *new); 

Описание

Функция переименования вызывает файл, имя которого является строка указал на которую old будет отныне известный под именем, заданным строкой , на которую указывает new. Файл с именем old больше не доступен по этому имени. Если файл, названный строкой, на которую указывает new, существует перед вызовом функции rename, поведение определено в реализации.

Возвращает

Функция rename возвращает ноль, если операция прошла успешно, отлична от нуля, если это не удается, 269) в этом случае, если файл существовавшие ранее он еще известен под своим оригинальным названием.

(Это все C Стандартная спецификация для rename(). Прочитайте POSIX link на много больше информации.)

Итак, как вы можете переименовать файл в то время как ваш наблюдать его в приложении? Основной индекс, который использует дескриптор открытого файла процесса просмотра фильма для доступа к файлу, который вы только rename() 'd не изменяется.

Это та же самая причина, почему вы можете unlink() (удалить) файл, пока он используется - все, что вы делаете, это удалить запись, указует на иноде - один из ссылок к иноду. Пространство, используемое файлом, не освобождается до тех пор, пока не будет удалена ссылка на индексный дескриптор - и дескриптор открытого файла считается ссылкой. Вот почему функция, которая удаляет запись в каталоге для файла, называется unlink() - вот и все. И да, файл (inode) может иметь более одной ссылки, указывающей на него.

+0

Итак, fd обращается к inode, прежде чем читать, сначала прочитайте inode, чтобы получить информацию о пути, а затем прочитайте, чтобы даже путь изменился, он получит новый путь перед чтением, это правильно? –

Смежные вопросы