Как я могу проверить, 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?