Отдельные write()
вызовы обрабатываются отдельно, а не как одна атомарная транзакция записи, и чередование полностью возможно, когда несколько процессов / потоков записывают в один и тот же файл.Порядок фактической записи определяется планировщиками (как планировщик процессов ядра, так и для «зеленых» потоков - планировщик библиотеки потоков).
Если не указано иное (флаг O_DIRECT
open
или аналогичный,если поддерживается), read()
и write()
работают с буферами ядра, а read()
будет использовать загруженный буфер вместо чтения диска снова.
Обратите внимание, что это может быть затруднено локальной буферизацией файла;например, stdio
и iostreams
будут считывать данные файла блоками в буфер в процессе, который не зависит от буферов ядра, поэтому write()
из другого места в данные, которые уже буферизированы в stdio
, не будетвидел.Аналогично, с буферизацией вывода не будет никакого фактического вывода на уровне ядра, пока выходной буфер не будет очищен, либо автоматически, потому что он заполнен, либо вручную из-за fflush()
или C ++ endl
(который неявно очищает буфер вывода).