日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
WRITE(2) FreeBSD システムコールマニュアル WRITE(2)
名称
write, writev, pwrite, pwritev -- 出力を書み込む
ライブラリ
標準 C ライブラリ (libc, -lc)
書式
#include <unistd.h>
ssize_t
write(int fd, const void *buf, size_t nbytes);
ssize_t
pwrite(int fd, const void *buf, size_t nbytes, off_t offset);
#include <sys/uio.h>
ssize_t
writev(int fd, const struct iovec *iov, int iovcnt);
ssize_t
pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset);
解説
write() システムコールは、記述子 fd によって参照されるオブジェクトへの
データの nbytes を buf によって指されるバッファに書き込むことを試みます。
writev() システムコールは、同じ動作を実行しますが、iov 配列: iov[0],
iov[1], ..., iov[iovcnt-1] のメンバによって指定された iovcnt バッファから
出力データを集めます。pwrite() と pwritev() システムコールは、同じ機能を
実行しますが、ファイルポインタを修正せずに、ファイルの指定された位置に書
き込みます。
writev() と pwritev() のために、iovec 構造体は、次のように定義されます:
struct iovec {
void *iov_base; /* ベースアドレス. */
size_t iov_len; /* 長さ. */
};
各 iovec エントリは、データが書き込まれるべきメモリの領域のベースアドレス
と長さを指定します。writev() システムコールは、常に次に進む前に、完全に領
域に書き込みます。
シーク可能なオブジェクトで、write() は、fd と関連したポインタによって与え
られる位置で開始します (lseek(2) を参照)。write() からの返るとき、ポイン
タは、書き込まれたバイトの数ずつ増加されます。
シーク可能でないオブジェクトは、常に現在の位置から書き込まれます。そのよ
うなオブジェクトに関連したポインタの値は、未定義です。
実ユーザがスーパユーザでないなら、write() は、ファイルのセットユーザ ID
(set-user-ID) ビットをクリアします。これは、スーパユーザによって所有され
ている書き込み可能なセットユーザ ID (set-user-ID) ファイルを ``捕らえる''
ユーザによってシステムセキュリティの侵入を防止します。
フロー制御の対象となるソケットのようなオブジェクトでブロッキングされない
I/O を使用するとき、write() と writev() は、要求されたものより少ないバイ
トを書き込むかもしれません。返り値は、注意されなければならず、操作の残り
は、可能なときに、再試行されるべきです。
戻り値
成功して完了するなら、実際に書き込まれたバイト数が返されます。そうでなけ
れば、-1 が、返され、グローバル変数 errno は、エラーを示す値に設定されま
す。
エラー
write(), writev(), pwrite() と pwritev() システムコールは、次の場合に、失
敗して、ファイルポインタは、変更されないままです:
[EBADF] fd 引数が、書き込みのためにオープンされた有効な記述子
ではありません。
[EPIPE] いずれかのプロセスによって読み込みのためにオープンされ
ていないパイプに書き込む試みが行われました。
[EPIPE] 通信相手ソケットに接続されていないタイプ SOCK_STREAM
のソケットに書き込む試みが行われました。
[EFBIG] プロセスのファイルサイズの制限または最大のファイルサイ
ズを越えているファイルに書き込む試みが行われました。
[EFAULT] iov の部分またはファイルに書き込まれるデータが、プロセ
スの割り付けられたアドレス空間の外側を指しています。
[EINVAL] fd に関連したポインタが、負でした。
[ENOSPC] ファイルを含んでいるファイルシステムに残っている空き空
間がありません。
[EDQUOT] ファイルを含んでいるファイルシステムのディスクブロック
のユーザのクォータ (quota) が使い果たされました。
[EIO] I/O エラーが、ファイルシステムから読み込んでいるか、ま
たはに書き込んでいる間に起こりました。
[EINTR] 書き込みが完了する前に、シグナルが割り込みました。
[EAGAIN] ファイルが、ブロッキングされない I/O とマークされて、
データを直ちに書き込むことができませんでした。
[EROFS] スライスの最初でディスクラベルの領域を越えて書き込む試
みが行われました。ディスクラベルの領域で書き込むを有効
にするためには、disklabel(8) -W を使用します。
[EINVAL] 値 nbytes は、SSIZE_MAX より大きくなります (または、
sysctl debug.iosize_max_clamp が 0 でないなら、INT_MAX
より大きくなります)。
[EINTEGRITY] 読み込む間に破損したデータを検出した fd のための外部記
憶装置。(例えば、部分的なファイルシステムのブロックを
書き込むことは、このエラーをトリカする既存のブロックを
最初に読み込む要求です。)
さらに、writev() と pwritev() は、次のエラーの 1 つを返します:
[EDESTADDRREQ] 宛先アドレスを設定するために使用される connect(2) で、
UNIX ドメインのデータグラムのソケットに書き込むとき、
宛先が、もはや利用可能ではありません。
[EINVAL] iovcnt 引数が、0 以下であったか、または IOV_MAX より大
きかった。
[EINVAL] iov 配列の iov_len 値の 1 つが、負でした。
[EINVAL] iov_len 値の合計は、SSIZE_MAX より大きく (または
sysctl debug.iosize_max_clamp が 0 でないなら、INT_MAX
より大きく) なります。
[ENOBUFS] mbuf プールが、ソケットに書き込んでいるとき、完全に使
い果たされました。
また pwrite() と pwritev() システムコールは、次のエラーを返します:
[EINVAL] offset 値が、負でした。
[ESPIPE] ファイル記述子が、パイプ、ソケット、または FIFO に関連
しています。
関連項目
fcntl(2), lseek(2), open(2), pipe(2), select(2)
規格
write() システムコールは、ISO/IEC 9945-1:1990 (``POSIX.1'') に適合するは
ずです。writev() と pwrite() システムコールは、X/Open Portability Guide
Issue 4, Version 2 (``XPG4.2'') に適合するはずです。
歴史
pwritev() システムコールは、FreeBSD 6.0 で登場しました。pwrite() 関数は、
AT&T System V Release 4 UNIX で登場しました。writev() システムコールは、
4.2BSD で登場しました。write() 関数は、Version 1 AT&T UNIX で登場しまし
た。
バグ
pwrite() システムコールは、IEEE Std 1003.1-2008 (``POSIX.1'') と反対に、
O_APPEND が設定されているなら、ファイルのオフセットを変更せずにファイルを
追加します、ここで、pwrite() は、O_APPEND が設定されているかどうかにかか
わらず、offset に書き込みます。
FreeBSD 13.2 February 11, 2021 FreeBSD 13.2