Использование стандартного объекта C IO представляет новый уровень сложности; файл изменяется только через write(2)
-семейство системных вызовов (или сопоставлений памяти, но это не используется в этом случае). C-стандартные обертки IO могут отложить запись в файл некоторое время и не могут отправлять полные запросы в одну систему вызов.
write(2)
сам вызов должен вести себя хорошо:
[...] If the file was
open(2)ed with O_APPEND, the file offset is first set to the
end of the file before writing. The adjustment of the file
offset and the write operation are performed as an atomic
step.
POSIX requires that a read(2) which can be proved to occur
after a write() has returned returns the new data. Note that
not all file systems are POSIX conforming.
Таким образом, ваши базовые write(2)
вызовы будут вести себя должным образом.
Для потоков ввода-вывода стандартного уровня C вам также необходимо позаботиться о буферизации. Функция setvbuf(3)
может использоваться для запроса небуферизованного вывода, вывода с линейной буферизацией или блочного буферизации. Поведение по умолчанию изменяется от потока к потоку - если стандартный вывод и стандартная ошибка записываются на терминал, то по умолчанию они буферизируются по строке и не загружаются. В противном случае блокировка по умолчанию является значением по умолчанию.
Возможно, вы захотите вручную выбрать буферизацию строки, если ваши данные естественно ориентированы на линию, чтобы предотвратить чередование данных.Если ваши данные равны , а не, ориентированные на линию, вы можете использовать un-buffered или оставить его блочным буфером, но вручную очищать данные всякий раз, когда вы накопили единую «единицу» вывода.
Если вы пишете более BUFSIZ
байт за один раз, ваши записи могут чередоваться. Функция setvbuf(3)
может помочь предотвратить чередование.
Возможно, преждевременно говорить о производительности, но буферизация строк будет медленнее, чем буферизация блоков. Если вы заходите рядом со скоростью диска, возможно, вы захотите применить другой подход полностью, чтобы ваши записи не чередовали.
Возможный (лучший) дубликат [fopen two processes] (http://stackoverflow.com/questions/1842909/fopen-two-processes). – blahdiblah
См. Также [Может ли несколько процессов присоединяться к файлу с помощью fopen без каких-либо проблем с параллелизмом?] (Http://stackoverflow.com/questions/7552451/can-multiple-processes-append-to-a-file-using-fopen- без-любой-параллелизм-вероит). – blahdiblah
Я не знаю контекста использования ваших журналов, но я бы рекомендовал взглянуть на 'syslog'. Может, тебе это подходит. Работа с ним очень проста. http://www.gnu.org/software/libc/manual/html_node/Submitting-Syslog-Messages.html –