을 C 표준 IO 기능을 사용하면 복잡한 새 레이어를 소개합니다; 파일은 write(2)
-family of system calls (또는 메모리 매핑,하지만이 경우에는 사용되지 않음)를 통해 수정됩니다. 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 표준 IO 스트림의 경우 버퍼링도 처리해야합니다. setvbuf(3)
함수는 버퍼되지 않은 출력, 라인 버퍼 출력 또는 블록 버퍼 출력을 요청하는 데 사용할 수 있습니다. 기본 동작은 스트림에서 스트림으로 변경됩니다. 표준 출력 및 표준 오류가 터미널에 쓰고 있으면 기본적으로 라인 버퍼링되고 버퍼링되지 않습니다. 그렇지 않으면 블록 버퍼링이 기본값입니다.
인터리브 된 데이터를 방지하기 위해 데이터가 자연스럽게 줄 단위 인 경우 수동으로 줄 버퍼를 선택하는 것이 좋습니다.데이터가 이 아니고 라인 지향 인 인 경우 버퍼링을 사용하지 않거나 블록 버퍼를 그대로두고 출력의 단일 "단위"를 누적 할 때마다 수동으로 데이터를 플러시 할 수 있습니다.
한 번에 BUFSIZ
바이트를 초과하여 쓰는 경우 쓰기가 인터리브 될 수 있습니다. setvbuf(3)
함수는 인터리빙을 방지하는 데 도움이 될 수 있습니다.
성능에 대해서는 이야기하기에는 시기상조이지만, 라인 버퍼링은 블록 버퍼링보다 느려질 것입니다. 디스크 속도 가까이에서 로깅하는 경우 쓰기가 인터리브되지 않도록 완전히 다른 방법을 사용하는 것이 좋습니다.
[두 개의 프로세스를 열 수 있습니다] 복제본이 가능합니다 (http://stackoverflow.com/questions/1842909/fopen-two-processes). – blahdiblah
[여러 프로세스가 동시성 문제없이 fopen을 사용하여 파일에 추가 할 수 있습니까?] (http://stackoverflow.com/questions/7552451/can-multiple-processes-append-to-a-file-using-fopen- without-any-concurrency-prob). – blahdiblah
로그 사용에 대한 컨텍스트를 알 수는 없지만'syslog'를 살펴 보는 것이 좋습니다. 어쩌면 그것은 당신에게 어울립니다. 그것으로 작업하는 것은 정말 간단합니다. http://www.gnu.org/software/libc/manual/html_node/Submitting-Syslog-Messages.html –