Як я можу перевірити, чи 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?