Использование fseek/fwrite из нескольких процессов для записи в разные области файла?

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

Это выглядит так:

  • Все процессы открывают один и тот же файл для записи.

  • Каждый процесс вызывает fseekдля поиска другого места в файле. Эта позиция может быть за концом файла.

  • Затем каждый процесс записывает блок данных в файл с помощью fwrite. Места поиска и размеры блоков таковы, что эти записи полностью разбивают раздел файла -- без пробелов, без перекрытий.

Гарантировано ли, что это сработает, или иногда это приведет к ужасным сбоям? Нет блокировки для сериализации записей, и на самом деле они, скорее всего, будут начинаться с точки синхронизации. С другой стороны, мы можем гарантировать, что они пишут в разные позиции файла, в отличие от других вопросов, в которых были проблемы с попыткой записи в «конец файла» из нескольких процессов.

Мне приходит в голову, что процессы могут быть на разных машинах, которые монтируют файл через NFS, что, я подозреваю, вероятно, отвечает на мой вопрос — но будет ли это работать, если файл локальный?

7
задан DigitalRoss 12 May 2012 в 18:45
поделиться