Как я могу проверить, mv
является ли атомарным на моем fs (ext4)?
Операционная система - Red Hat Enterprise Linux Server версии 6.8.
В общем, как я могу это проверить? Я посмотрел вокруг и не нашел, если моя ОС стандартная POSIX.
Как я могу проверить, mv
является ли атомарным на моем fs (ext4)?
Операционная система - Red Hat Enterprise Linux Server версии 6.8.
В общем, как я могу это проверить? Я посмотрел вокруг и не нашел, если моя ОС стандартная POSIX.
Ответы:
Интересно, что ответ может быть «Это зависит».
Чтобы было ясно, mv
как указано в
mv
Утилита выполняет действия , эквивалентныеrename()
функции
Спецификация функции переименования гласит:
Эта
rename()
функция для обычных файлов эквивалентна той, которая определена стандартом ISO C. Его включение здесь расширяет это определение для включения действий над каталогами и определяет поведение, когда новый параметр называет файл, который уже существует. Эта спецификация требует, чтобы действие функции было атомарным.
Но последняя спецификация ISO C для rename()
государств:
7.21.4.2
rename
Функцияконспект
#include <stdio.h> int rename(const char *old, const char *new);
Описание
rename
Функция вызывает файл, имя которого является строка , на которую указываетold
будет отныне известный под именем , заданным в строке , адресуемойnew
. Названный файлold
больше не доступен под этим именем. Если файл, названный строкой, на которую указывает строка,new
существует до вызоваrename
функции, поведение определяется реализацией.Возвращает
В
rename
Функции возвращает ноль , если операция прошла успешно, отлично от нуля , если это не удается, и в этом случае , если файл ранее существовал он по - прежнему известен под своим оригинальным названием.
Удивительно, но обратите внимание, что нет явного требования атомарности. Это может потребоваться где-то еще в последнем общедоступном стандарте C, но я не смог его найти. Если кто-то может найти такое требование, редактирование и комментарии приветствуются.
Смотрите также Является ли rename () атомарным?
Согласно справочной странице по Linux :
Если он
newpath
уже существует, он будет атомарно заменен, так что не будет точки, в которой другой процесс, пытающийся получить доступnewpath
, найдет его отсутствующим. Однако, вероятно, будет окно, в котором обаoldpath
иnewpath
ссылаются на переименованный файл.
Справочная страница Linux утверждает, что замена файла будет атомарной.
Однако проверить и проверить, что атомарность может быть очень трудным, если вам нужно продвинуться так далеко. Вам не ясно, что вы имеете в виду при использовании «Как я могу проверить, является ли mv атомным». Вы хотите, чтобы требования / спецификация / документация были атомарными, или вам действительно нужно их протестировать ?
Также обратите внимание, что в приведенном выше примере предполагается, что имена двух файлов операндов находятся в одной файловой системе. Я не могу найти стандартного ограничения на mv
утилиту для обеспечения этого.
rename
атомарности.
/
ext4 fs и /tmp
как другой ext4 fs, то вы не можете атомарно mv от одного к другому.
mv
основан на rename
системном вызове и rename()
является атомарным. Вы можете посмотреть на справочную страницу rename(2)
.
Вы могли бы найти ответ на Является ли rename () атомарным? на стеке потока
Что за фс, вы использовали?
В дополнение к проверке системных вызовов и их атомарности, может inotify-tools
служить тестом, хотя я не уверен, является ли это гарантированным доказательством атомарности.
Откройте 2 снаряда. Посмотрите целевой каталог перемещения в одном из них:
inotifywait -m target/
Переместите файл в другой каталог:
mv foobar target/
inotifywait
Должен показывать только одну строку:
target/ MOVED_TO foobar
Он кажется атомарным по сравнению с ответом на ls target/
и touch target/a
, который выдает многострочные сообщения, такие как:
# the response to ls target/
target/ OPEN,ISDIR
target/ ACCESS,ISDIR
target/ CLOSE_NOWRITE,CLOSE,ISDIR
PS
Я думаю, что, по крайней мере, это показывает, что асинхронное многопроцессорное взаимодействие с файлами безопасно inotify
(практически атомарно): в любом случае вы отвечали бы только после того, как inotify
дали окончательный сигнал после операции. Например, установка «производитель-потребитель» может быть легко и безопасно реализована inotify
.
strace
?