Является ли mv атомарным на моей файловой системе?

Это лучше всего подходит для awk

$ cat ip.txt 
Josh, Adams, Joshadams@gmail.com
Henry, Ford, HFord@gmail.com

$ awk -F"[ ,]+" '{print $2, $1}' ip.txt 
Adams Josh
Ford Henry
  • -F "[,] +" разделитель полей - это один или несколько пробелов и , символов
  • Затем просто выведите второй и первый столбцы
12
09.11.2016, 15:24
3 ответа

Достаточно интересно, кажется, что ответ может быть: «Это зависит от обстоятельств».

Для ясности: mv указывается с до

Утилита mv должна выполнять действия, эквивалентные функции rename ()

В спецификации функции переименования говорится:

Эта функция rename () эквивалентна для обычных файлов функции , определенной стандартом ISO C. Его включение здесь расширяет определение , включая действия с каталогами, и определяет поведение , когда новый параметр называет уже существующий файл. Эта спецификация требует, чтобы действие функции было атомарным.

Но последняя спецификация ISO C для rename () гласит:

7.21.4.2 Функция переименовать

Краткое содержание

 #include  
int rename (const char * old, const char * new); 
 

Описание

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

Возвращает

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

Удивительно, но обратите внимание, что нет явного требования атомарности. Он может потребоваться где-то еще в последнем общедоступном стандарте C, но мне не удалось его найти. Если кто-то может найти такое требование, мы приветствуем правки и комментарии.

См. Также Является ли rename () атомарной?

Согласно странице руководства Linux :

Если newpath уже существует, он будет заменен атомарно, поэтому что не существует точки, в которой другой процесс, пытающийся получить доступ к newpath , не обнаружит, что он отсутствует. Однако, вероятно, будет окно , в котором оба oldpath и newpath относятся к переименованному файлу .

На странице руководства Linux утверждается, что замена файла будет атомарной.

Тестирование и проверка того, что атомарность может быть очень сложной, однако, если это то, насколько далеко вам нужно зайти. Вам непонятно, что вы имеете в виду, используя «Как я могу проверить, является ли mv атомарным».Вы хотите, чтобы требования / спецификация / документация были атомарными, или вам действительно нужно проверить это?

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

11
27.01.2020, 19:56

mv основан на системном вызове rename , а rename () является атомарным. Вы можете посмотреть справочную страницу rename (2) .

Вы можете найти ответ на Является ли rename () атомарной? в stackoverflow.

Какую фс вы использовали?

0
27.01.2020, 19:56

В дополнение к проверке системных вызовов и их атомарности, возможно, 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 

ПС

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

-1
27.01.2020, 19:56

Теги

Похожие вопросы