Книга: Linux программирование в примерах
5.1.4. Переименование файлов
5.1.4. Переименование файлов
При данном способе отображения элементами каталога имен на номера индексов, переименование файла концептуально очень просто:
1. Если новое имя файла обозначает существующий файл, сначала удалить этот файл.
2. Создать новую ссылку на файл через новое имя.
3. Удалить старое имя (ссылку) для файла. (Удаление имен обсуждается в следующем разделе.)
Ранние версии команды mv работали таким способом. Однако, при таком способе переименование файла не является атомарным; т.е. оно не осуществляется посредством одной непрерываемой операции. И на сильно загруженной системе злонамеренный пользователь мог бы воспользоваться условиями состояния гонки[51], разрушая операцию переименования и подменяя оригинальный файл другим.
По этой причине 4.2 BSD ввело системный вызов rename()
:
#include <stdio.h> /* ISO С */
int rename(const char *oldpath, const char *newpath);
На системах Linux операция переименования является атомарной; справочная страница утверждает:
Если newpath
уже существует, он будет атомарно замещен ..,
таким образом, что при попытке другого процесса получить доступ к newpath
он никогда не обнаружит его отсутствующим.
Если newpath
существует, но по какой-либо причине операция завершается неудачей, rename
гарантирует, что экземпляр newpath
останется на месте. Однако, в ходе переписывания возможно будет окно, в котором как oldpath
, так и newpath
ссылаются на переименовываемый файл.
Как и в случае с другими системными вызовами, возвращенный 0 означает успех, а (-1) означает ошибку.