Использование 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) может иметь более одной ссылки, указывающей на него.
Итак, fd обращается к inode, прежде чем читать, сначала прочитайте inode, чтобы получить информацию о пути, а затем прочитайте, чтобы даже путь изменился, он получит новый путь перед чтением, это правильно? –