Как Linux обрабатывает случай, когда несколько процессов пытаются заменить один и тот же файл одновременно? - PullRequest
3 голосов
/ 07 июня 2019

Я знаю, что это немного теоретический вопрос, но пока не получил удовлетворительного ответа. Вот и подумал поставить этот вопрос здесь. У меня есть несколько процессов C ++ (также хотел бы знать поведение потока), которые утверждают, чтобы заменить один и тот же файл одновременно. Насколько это безопасно делать в Linux (с использованием Ubuntu 14.04 и Centos 7)? Нужно ли ставить замки?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 07 июня 2019

Файловые системы ОС на основе Unix, таких как Linux, разработаны на основе понятия inode , которые представляют собой внутренние записи, описывающие различные метаданные о файле.Обычно они не взаимодействуют напрямую с пользователями или программами, но их наличие дает этим файловым системам определенный уровень косвенности, который позволяет им предоставлять некоторую полезную семантику, которую другие ОС (читай: Windows) не могут.

filename --> inode --> data

В частности, когда файл удаляется, на самом деле происходит отделение inode файла от его имени файла;не (обязательно) удаление данных самого файла.Таким образом, файл и его содержимое могут продолжать существовать (хотя и незаметно, с точки зрения пользователя), пока все процессы не закроют свои дескрипторы файлов, которые были открыты в этом файле;если индекс больше не доступен для какого-либо процесса, только тогда отметит, что файловая система фактически пометит блоки данных файла как свободные и доступные для повторного использования.Тем временем, имя файла становится доступным для связывания инода (и данных) другого файла, даже если инод / данные старого файла все еще технически существуют.

Результат этогочто в Linux вполне допустимо удалить (или переименовать) файл в любое время, даже если другие потоки / процессы находятся в процессе его использования;Ваше удаление будет успешным, и любые другие программы, у которых этот файл открыт в этот момент, могут просто продолжить чтение / запись / использование его, точно так, как если бы он не был удален.Единственное, что отличается тем, что имя файла больше не будет отображаться в его каталоге, и когда они вызовут fclose() (или close() или т. Д.) Для файла, данные файла исчезнут.

Поскольку выполнение mv new.txt old.txt по существу аналогично выполнению rm old.txt ; mv new.txt old.txt, не должно быть проблем с выполнением этого из нескольких потоков без какой-либо синхронизации.(обратите внимание, что немного другая ситуация, когда несколько потоков или процессов открывают один и тот же файл одновременно и записывают в него одновременно, немного опаснее; ничего не произойдет, но им будет легко перезаписать данные друг друга и испортитьфайл, если они не осторожны)

0 голосов
/ 07 июня 2019

Это зависит от того, что именно вы собираетесь делать и как вы используете файлы. В целом, в системах Unix / Posix, таких как Linux, все файловые вызовы будут успешными, если их создаст несколько процессов, и в общем случае ОС обрабатывает конфликты как «последний, кто что-то выигрывает». По сути, все модификации файловой системы сериализуются, поэтому файловая система всегда находится в согласованном состоянии. Но в остальном это бесплатно для всех.

Здесь много деталей. При открытии файла, например O_EXCL, используются флаги, которые могут привести к сбою, если другой процесс сделает это первым (своего рода блокировка). Есть рекомендации (иначе операционная система никого не заставляет обращать на них внимание), блокирующие системы, например flock (попробуйте набрать man 2 flock, чтобы узнать больше) для содержимого файлов. Есть более специфичная для Linux система обязательной блокировки.

А также есть такие подробности, как «Что произойдет, если кто-то удалил файл, который я открыл?» что другой ответ объясняет правильно и хорошо.

И, наконец, существует целый беспорядок деталей, связанных с тем, гарантировано ли, что какое-то конкретное изменение в файловой системе будет записано на всю вечность, или есть ли вероятность его исчезновения, если кто-то щелкнет выключателем питания. И это полторы беспорядка, когда вы действительно погрузитесь в это, между хитрым аппаратным обеспечением, которое лжет ОС, о вещах к запутанной болтовне различных системных вызовов Linux, охватывающих различные аспекты этой проблемы, часто входя в Linux из разных эпох История Unix / Posix и странное и загадочное взаимодействие друг с другом.

Итак, ответ на ваш очень общий и открытый вопрос обязательно должен быть расплывчатым, абстрактным и волнующим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...