В чем преимущества 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
, чтобы избежать возможных условий гонки, когда задействованы несколько потоков.