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