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