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

Если мой процесс пытается прочитать из файла, то как я могу убедиться в том, что из моего кода (язык C) никакой другой процесс не пишет или не удаляет его (включая системные команды для удаления файла)?

Кроме того, можно ли этого достичь на всех ОС (Windows, Linux, Solaris, HP-UX, VxWorks и т. Д.)?

Ответы [ 4 ]

3 голосов
/ 08 октября 2010

Редактировать: я отвечу за Unix / Linux

Как сказали gspr и другие, взгляните на блокировку файлов, используя fcntl, flock и т. Д. Однако,Имейте в виду, что это ADVISORY LOCKING методов.

Что это значит?Это означает, что вы можете предупредить другие процессы о том, что вы в данный момент обращаетесь к файлу или его части, но вы не можете принудительно удержать их от игнорирования вас и записи по всему файлу .

ОБЯЗАТЕЛЬНЫЕ блокирующие примитивы отсутствуют.Вы можете использовать права доступа в своих интересах, но у вас никогда не будет полной гарантии - пользователь root всегда сможет отменить ваши ограничения.Я не думаю, что есть способ обойти это.

1 голос
/ 08 октября 2010

Для систем POSIX посмотрите на fcntl.flock также может представлять интерес, хотя я не думаю, что это часть POSIX.

0 голосов
/ 08 октября 2010

Скопируйте файл, внесите изменения, затем переименуйте его поверх оригинала.

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

0 голосов
/ 08 октября 2010

Вы должны открыть файл с правами доступа для чтения READ, что означает, что любой, кто пытается открыть его, может получить только права на чтение. Как говорит @Pointy, это зависит от ОС, и вам, вероятно, придется кодировать это отдельно для Windows, Linux и т. Д. Однако большинство современных ОС должно поддерживать это.

...