Як я можу перевірити, чи 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, але я не зміг його знайти. Якщо хтось може знайти таку вимогу, редагування та коментарі більш ніж вітаються.
Дивіться також Чи перейменований () атомний?
Якщо він
newpath
вже існує, він буде атомно замінений, так що немає жодного пункту, коли інший процес, який намагається отримати доступnewpath
, визнає його відсутнім. Однак, ймовірно, буде вікно, в якому обидваoldpath
іnewpath
посилаються на перейменований файл.
Сторінка "Людина Linux" стверджує, що заміна файла буде атомною.
Тестування та перевірка того, що атомність може бути дуже важким, хоча, якщо саме так, потрібно пройти. Вам не ясно, що ви маєте на увазі під час використання "Як я можу перевірити, чи є mv атомним". Ви хочете, щоб вимоги / специфікація / документація була атомною, чи вам потрібно її фактично перевірити ?
Зауважимо також, що вищевикладене передбачає, що два імені файлів операндів знаходяться в одній файловій системі. Я не можу знайти жодного стандартного обмеження на mv
утиліту, щоб це застосувати.
rename
атомність.
/
ext4 fs і /tmp
як різні ext4 fs, ви не можете атомно mv від одного до іншого.
mv
заснований на rename
системному виклику і rename()
є атомним. Ви можете подивитися на сторінці rename(2)
.
Ви можете знайти відповідь на те, чи перейменований () атомний? на stackoverflow.
Який тип fs ви використовували?
Окрім перевірки системних викликів та їх атомності, можливо, 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
?