LINUX.ORG.RU

FILE* для буфферизированного доступа. Дёргать write(2) на каждые несколько записанных байт крайне медленно.
Ну и write(2) когда нужно произвести одну операцию записи на дескриптор

mittorn ★★★★★
()

Первые, чтобы эта libc’шная кривожопая буферизация не мешалась под ногами, и чтобы не пользоваться API придуманным идиотами, например вспоминать какой режим для fopen что значит, и достаточно ли вызвать fflush перед закрытием записываемого файла.

anonymous
()

зависит от задачи. выше уже написали про буферизацию. а иногда и mmap нужно применять, для большей эффективности. если же просто в небольшой файл писать, то достаточно fopen/fwrite/fseek и же с ними. это часть стандарта С. прочие реализации могут зависеть от платформы.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)

я обычно FILE. А в целом без разницы, потому что они во-первых конвертируются друг в друга, во-вторых, по-хорошему конечно лучше использовать mmap, если возможно. А еще лучше - dio через какой-нибудь io_uring, а еще лучше - купить специальное железо с поддержкой ZNS :))

Lrrr ★★★★★
()

Из этих двух - сисколлы с fd. Для некоторых частных случаев (печать логов и других append-only потоков данных в файл, или построчное чтение файла) - свои обёртки.

firkax ★★★★★
()
Ответ на: комментарий от mittorn

Дёргать write(2) на каждые несколько записанных байт крайне медленно.

write() гарантирует что данные попадут в page cache ярда. А попадут ли данные физически на диск – зависит от ядра и файловой системы. Даже вызов fsync() / fdatasync() не гарантируют, что данные физически окажутся на диске. К примеру, на ZFS данные попадут в ZIL. Фактически сброс на диск произойдёт позже, в рамках транзакционного commit’а.

iron ★★★★★
()
Ответ на: комментарий от iron

Да, использование сисколов не гарантирует что буфферизации не будет и данные попадут на диск. Но зато гарантирует, переключение в ядро с соответствующим оверхедом. На мелких порциях данных это может понизить производительность в десятки раз и оверхед от аллокации буффера для stdio на фоне этого окажется незначительным.
Ну и не стоит забывать, что stdio - стандартный для си, а вот open/read/write - только в рамках posix и на не-posix системах могут отсутствовать или вести себя иначе (в windows это скорее совместимость с dos, а не posix)

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 1)