Provided by: manpages-ja-dev_0.5.0.0.20210215+dfsg-1_all
名前
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) で規定された全てのエラーが発生する可能性があり、 errno にはエラーを示す値が設定される。 pwrite() では、 write(2) および lseek(2) で規定さ れた全てのエラーが発生する可能性があり、 errno にはエラーを示す値が設定される。
バージョン
システムコール pread() と pwrite() は Linux にバージョン 2.1.60 で追加された。 i386 のシ ステムコールのエントリーは 2.1.69 で追加された。 (システムコールを持たない古いカーネルでの lseek(2) を使ったエミュレーションを含めると) C ライブラリにおけるサポートは glibc 2.1 で 追加された。
準拠
POSIX.1-2001.
注意
システムコール pread() と pwrite() は、特にマルチスレッドアプリケーションで役に立つ。 これ らを使うと、 他のスレッドによるファイルオフセットの変更の影響を受けることなく、 複数のス レッドが同じファイルディスクリプターに対して入出力を行うことができる。 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.79 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。