Эй, пожалуйста, не возражаете, если я задаю тривиальный вопрос, но, пожалуйста, кто-нибудь поможет мне в этом.
В чем преимущества pwrite и pread над fwrite и fread?
Ответ 1
Это полезно, когда вы произвольно читаете/пишете. Существует даже опция для Sqlite, которая заменяет seek() + read() и seek() + write() на pread()/pwrite(). Почему это полезно? seek() + read() и seek() + write() являются одновременно парами sys-вызовов, а pread() и pwrite() являются одиночными sys-вызовами. Меньше sys-вызовов - большая эффективность.
Ответ 2
Есть две части:
-
Разница между
pread/pwriteиread/write:Они оба на одном уровне, а именно системные вызовы. Существуют две отличия:
- Варианты "p" смещаются для чтения, поэтому они не зависят от текущего указателя файла. Это упрощает чтение и запись из нескольких потоков одновременно.
- Варианты "p" работают только с файлами, доступными для поиска (например, реальные файлы, а не трубы, сокеты или устройства).
-
Разница между
read/pread/write/pwriteиfread/fwrite:Варианты "f" - это стандартные обертки времени выполнения первого (с использованием основных вариантов). Они поддерживают буферизацию в процессе. Это может значительно повысить производительность для простого кода, но при этом использует другие функции уровня системного вызова непрактично.
Используйте только варианты "p" , если у вас есть хорошее использование для чтения в случайных смещениях (избегая поиска и разрешая одновременный доступ через один дескриптор файла), что часто случается с некоторыми файлами базы данных (с ориентацией на запись с записями на известные смещения) и редко в других приложениях.
Ответ 3
Текущее положение файла не изменяется после вызова pread/pwrite.
Также, потому что вам не нужно вызывать lseek, чтобы изменить текущую позицию файла pread/pwrite, чтобы избежать возможных условий гонки, когда задействованы несколько потоков.