нет, как правило, это небезопасно!
вам необходимо получить эксклюзивную блокировку записи для каждого процесса - это означает, что все другие процессы должны будут ждатьв то время как один процесс записывает в файл ... чем больше у вас интенсивных процессов ввода-вывода, тем дольше время ожидания.
лучше иметь один выходной файл на процесс и отформатировать эти файлы с отметкой времени иидентификатор процесса в начале строки, чтобы впоследствии вы могли объединить и отсортировать эти выходные файлы в автономном режиме.
Совет: проверьте формат файлов журналов веб-сервера - это делается с отметкой временив начале строки, чтобы потом их можно было объединить и отсортировать.
EDIT
Процессы UNIX используют определенный / фиксированный размер буфера при открытии файлов (например, 4096 байт), для передачи данных в и из файла на диске.Когда буфер записи заполнен, процесс сбрасывает его на диск - это означает, что он записывает полный буфер на диск!Обратите внимание, что это происходит, когда буфер заполнен!- не тогда, когда есть конец строки!Это означает, что даже для одного процесса, который записывает в файл текстовые данные, ориентированные на строки, эти строки обычно обрезаются где-то посередине во время очистки буфера.Только в конце, когда файл закрыт после записи, вы можете предположить, что файл содержит полные строки!
Таким образом, в зависимости от того, когда ваш процесс решит сбросить свои буферы, они будут в разное время записывать в файл -- например, порядок не является детерминированным / предсказуемым. Когда буфер сбрасывается в файл, вы можете не предполагать, что он будет писать только полные строки - например, он обычно будет писать частичные строки ,тем самым путая вывод, если несколько процессов очищают свои буферы без синхронизации.
Проверьте эту статью в Википедии: http://en.wikipedia.org/wiki/File_locking#File_locking_in_UNIX
Цитата:
Операционные системы Unix (включая Linux и Mac OS X от Apple, иногда называемые Darwin) обычно не блокируют автоматически открытые файлы или запущенные программы. Существует несколько типов механизмов блокировки файлов.доступны в различных вариантах Unix, и многие операционные системы поддерживают более одного вида совместимости.Двумя наиболее распространенными механизмами являются fcntl (2) и flock (2).Третий такой механизм - lockf (3), который может быть отдельным или может быть реализован с использованием любого из первых двух примитивов.
Вы должны использовать либо flock, либо Mutexes длясинхронизируйте процессы и убедитесь, что только один из них может записывать в файл одновременно.
Как я уже упоминал ранее, вероятно, быстрее, проще и проще иметь один выходной файл длякаждый процесс, а затем, при необходимости, объединять эти файлы (в автономном режиме). Этот подход используется, например, некоторыми веб-серверами, которым необходимо регистрировать несколько файлов из нескольких потоков - и необходимо убедиться, что разныевсе потоки высокопроизводительны (например, не нужно ждать друг друга при блокировке файла).
Вот соответствующий пост: (Отметьте галочкой ответ Байера! принятый ответ не верен / не актуален.)
Безопасно ли передавать несколько параллельных процессов в один файл, используя >>?
РЕДАКТИРОВАТЬ 2:
inсИзвините, вы сказали, что хотите записать блоки двоичных данных фиксированного размера из разных процессов в один и тот же файл.
Только в том случае, если размер вашего блока точно соответствует размеру системного буфера файлов, можетэто работа!
Убедитесь, что ваша фиксированная длина блока соответствует размеру системного буфера файлов .В противном случае вы попадете в ту же ситуацию, что и с незавершенными строками.Например, если вы используете блоки по 16 Кб, а система использует блоки по 4 Кб, то в общем случае вы увидите блоки размером 4 Кб в случайном порядке - нет гарантии, что вы всегда увидите 4 блока подряд из одного и того же процесса1061 *