файлы на нескольких процессах - PullRequest
5 голосов
/ 22 апреля 2009

Если один из моих процессов открывает файл, скажем, только для чтения, гарантирует ли O.S, что никакой другой процесс не будет писать на нем, когда я читаю, может быть, оставить процесс чтения с первой частью старой версии файла и второй частью более новой версии файла, что ставит под сомнение целостность данных?

Я не говорю о каналах, которые не имеют поиска, но о обычных файлах, с опцией поиска (по крайней мере, если открыт только с одним процессом).

Ответы [ 3 ]

3 голосов
/ 22 апреля 2009

Нет, другие процессы могут изменять содержимое файла, когда вы читаете его. Попробуйте запустить "man fcntl" и игнорировать раздел о "консультативных" блокировках; это «необязательные» блокировки, на которые процессы должны обращать внимание, только если хотят. Вместо этого ищите (увы, не POSIX) «обязательные» блокировки. Эти защитят вас от других программ. Попробуйте заблокировать чтение.

2 голосов
/ 23 апреля 2009

Любой процесс, который может открыть файл для записи, может писать в него. Запись может происходить одновременно с вашими собственными записями, что может привести к (потенциально) неопределенным состояниям.

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

Лучше не предоставлять права на запись процессам, которые вы не хотите записывать в файл.

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

Если файл открывается потоковой программой (или задачей, которая совместно использует свои файловые дескрипторы с другим, в более общем смысле), указатель файла также используется совместно, поэтому вам нужно использовать другой метод для доступа к файлу, чтобы избежать состояния гонки вызывая хаос - обычно функции pread, pwrite или scatter / collect, readv и writev.

2 голосов
/ 22 апреля 2009

Нет, если вы открываете файл, другие процессы могут записывать в него, если вы не используете блокировку.

В Linux вы можете добавить консультативную блокировку для файла с помощью:

#include <sys/file.h>

...

flock(file_descriptor,LOCK_EX); // apply an advisory exclusive lock
...