Является ли rename () атомарным?
Я не могу проверить это с помощью экспериментов и не мог собрать его с man-страниц.
скажем, у меня есть два процесса, один из которых перемещает(переименовывает) file1 из directory1 в directory2. Скажем, другой процесс, выполняющийся одновременно, копирует содержимое directory1 и directory2 в другое место. Возможно ли, что копия происходит таким образом, что directory1 и directory2 будут показывать file1 - i.e directory1 копируется перед перемещением, а directory2-после двигайтесь первым процессом.
в основном это rename () является атомарным системным вызовом?
спасибо
3 ответов
да и нет.
rename () является атомарным, если ОС не аварийно завершает работу. Он не может быть разделен любой другой файловой системой op.
Если система аварийно завершает работу, вы можете увидеть операцию ln ().
также обратите внимание, что при работе в сетевой файловой системе вы можете получить ENOENT, когда операция прошла успешно. Локальная файловая система не может сделать это с вами.
Это очень поздний ответ, но... да rename()
является атомной, но не в смысле вашего вопроса. Под Linux rename(2)
говорит:
однако при перезаписи, вероятно, будет окно, в котором оба oldpath и newpath относятся к переименованному файлу.
но rename()
по-прежнему является атомарным в очень важном смысле: если вы используете его для перезаписи файла, то вы получите либо старую, либо новую версию и ничего еще.
[обновление: но, как указывает @jonas-wielicki в комментариях, вам нужно убедиться, что файл, который вы переименовываете, действительно имеет современное содержимое, используя fsync()
и друзей.]
если newpath уже существует, он будет автоматически заменен (при несколько условий, см. ошибки ниже), так что нет точки, в которой другой процесс, пытающийся получить доступ к newpath, обнаружит, что он отсутствует.
если вы видите Ошибки, вы обнаружите, что переименование может потерпеть неудачу, но оно никогда не нарушит атомарность.
это все из справочной страницы Linux. Чего я не знаю, так это если вы сделаете rename()
в сетевой файловой системе, где сервер запускает другую ОС. Значит, у клиента есть хоть какая-то надежда гарантировать атомарность? Сомневаюсь.
Я не уверен, что "в основном" часть вашего вопроса является действительным. Если у вас нет какой-то синхронизации между ними, не имеет значения, как атомарное переименование. Если копия каталога попадает туда до переименования, у вас будет file1 в обоих местах.
Я не уверен, что вы имели в виду поток или процессы, но если есть механизмы блокировки для обоих, блокировки потоков намного проще, потому что они не должны пересекать границы процесса.