EN JA
PREAD(2)
PREAD(2) Linux Programmer's Manual PREAD(2)

名前

pread, pwrite -指定したオフセットでファイルディスクリプタを読み書きする

書式

#include <unistd.h>
 
ssize_t pread(int fd , void * buf , size_t count , off_t offset );
 
ssize_t pwrite(int fd , const void * buf , size_t count , off_t offset );
 

glibc 向けの機能検査マクロの要件 ( feature_test_macros(7) 参照):
 
pread(), pwrite():
_XOPEN_SOURCE >= 500
 
|| /* glibc 2.12 以降: */ _POSIX_C_SOURCE >= 200809L

説明

pread() は、ファイルディスクリプタ fd の (ファイルの先頭からの) オフセット offset から最大 count バイトをバッファ buf へ読み込む。ファイル・オフセットは変化しない。

pwrite() は、バッファ buf から最大 count バイトをファイルディスクリプタ fd のオフセット offset に書き込む。ファイル・オフセットは変化しない。

fd で参照されるファイルはシーク (seek) 可能でなければならない。

返り値

成功した場合、読み書きを行ったバイト数が返される (ゼロは、 pwrite() の場合には何も書かれなかったことを意味し、 pread() の場合にはファイルの末尾に達したことを意味する)。エラーの場合は-1 が返され、 errno がそのエラーを示すように設定される。

エラー

pread() では、 read(2) および lseek(2) で規定された全てのエラーが発生する可能性があり、 error にはエラーを示す値が設定される。 pwrite() では、 write(2) および lseek(2) で規定された全てのエラーが発生する可能性があり、 error にはエラーを示す値が設定される。

バージョン

システムコール pread() と pwrite() は Linux にバージョン 2.1.60 で追加された。 i386 のシステムコールのエントリは 2.1.69 で追加された。 (システムコールを持たない古いカーネルでの lseek(2) を使ったエミュレーションを含めると) C ライブラリにおけるサポートは glibc 2.1 で追加された。

準拠

POSIX.1-2001.

注意

Linux では、裏で呼び出されるシステムコールの名前がカーネル 2.6 で変更された。 pread() は pread64() になり、 pwrite() は pwrite64() になった。システムコールの番号は変更されていない。 glibc の pread() と pwrite() のラッパー関数はこれらの変更を吸収している。
 
いくつかの 32 ビットアーキテクチャでは、これらのシステムコールの呼び出し時のシグネチャーが違っています。理由は syscall(2) で説明されている通りです。

バグ

POSIX では、 O_APPEND フラグを指定してファイルをオープンした場合、 pwrite() がデータを書き込む位置に影響を及ぼさないことが求められている。しかし、 Linux では、ファイルを O_APPEND 付きでオープンした場合、 offset の値に関わらず、 pwrite() はファイルの末尾にデータを追記する。

関連項目

lseek(2), read(2), readv(2), write(2)

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2013-04-01 Linux