Manpages

名 前

write − フ ァ イ ル デ ィ ス ク リ プ タ ー (file descriptor) に 書 き 込 む

書 式

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

説 明

write() は 、 buf が 指 す バ ッ フ ァ ー か ら 、 フ ァ イ ル デ ィ ス ク リ プ タ ー fd が 参 照 す る フ ァ イ ル へ 、 最 大 count バ イ ト を 書 き 込 む 。 書 き 込 ま れ る バ イ ト 数 は count よ り も 小 さ く な る こ と が あ る 。 例 え ば 、 書 き 込 み 対 象 の 物 理 メ デ ィ ア に 十 分 な 領 域 が な い 場 合 、 リ ソ ー ス 上 限 RLIMIT_FSIZE に 達 し た 場 合 (setrlimit(2) 参 照 )、 count バ イ ト 未 満 の 書 き 込 み が 行 わ れ た 後 で 呼 び 出 し が シ グ ナ ル ハ ン ド ラ ー に よ り 割 り 込 ま れ た 場 合 、 な ど で あ る 。 (pipe(7) も 参 照 の こ と 。 )

seek 可 能 な フ ァ イ ル (つ ま り lseek(2) が 適 用 で き る フ ァ イ ル 、 例 え ば 通 常 の フ ァ イ ル ) で は 、 書 き 込 み は 現 在 の フ ァ イ ル オ フ セ ッ ト か ら 行 わ れ 、 フ ァ イ ル オ フ セ ッ ト は 実 際 に 書 き 込 み が 行 わ れ た バ イ ト 数 分 加 算 さ れ る 。 フ ァ イ ル が O_APPENDopen(2) さ れ た 場 合 、 フ ァ イ ル オ フ セ ッ ト は 書 き 込 み 前 に フ ァ イ ル の 末 尾 に 設 定 さ れ る 。 フ ァ イ ル オ フ セ ッ ト の 調 整 と 書 き 込 み 操 作 は ア ト ミ ッ ク な 処 理 と し て 実 行 さ れ る 。

POSIX は write() が 行 な わ れ た 後 に 実 行 し た read(2) が 新 し い デ ー タ を 返 す こ と を 要 求 し て い る 。 全 て の フ ァ イ ル シ ス テ ム が POSIX 準 拠 で は な い 点 に 注 意 す る こ と 。

返 り 値

成 功 し た 場 合 、 書 き 込 ま れ た バ イ ト 数 が 返 さ れ る (ゼ ロ は 何 も 書 き 込 ま れ な か っ た こ と を 示 す )。 エ ラ ー な ら ば −1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。

count が 0 で 、 fd が 通 常 の フ ァ イ ル (regular file) を 参 照 し て い る 場 合 、 write() は 後 述 の エ ラ ー の い ず れ か を 検 出 し た 場 合 、 失 敗 を 返 す こ と が あ る 。 エ ラ ー が 検 出 さ れ な か っ た 場 合 は 、 0 を 返 し 、 他 に 何 の 影 響 も 与 え な い 。 count が 0 で 、 fd が 通 常 の フ ァ イ ル 以 外 の フ ァ イ ル を 参 照 し て い る 場 合 、 そ の 結 果 は 規 定 さ れ て い な い 。

エ ラ ー

EAGAIN フ ァ イ ル デ ィ ス ク リ プ タ ー

fd が ソ ケ ッ ト 以 外 の フ ァ イ ル を 参 照 し て い

て 、 非 停 止 (nonblocking) モ ー ド (O_NONBLOCK) に 設 定 さ れ て お り 、 書 き 込 み を 行 う と 停 止 す る 状 況 に あ る 。

EAGAIN ま た は EWOULDBLOCK フ ァ イ ル デ ィ ス ク リ プ タ ー fd が ソ ケ ッ ト を 参 照 し て い て 、 非 停 止 (nonblocking) モ ー ド (O_NONBLOCK) に 設 定 さ れ て お り 、 書 き 込 み を 行 う と 停 止 す る 状 況 に あ る 。 POSIX.1−2001 は 、 こ の 場 合 に ど ち ら の エ ラ ー を 返 す こ と も 認 め て お り 、 こ れ ら 2 つ の 定 数 が 同 じ 値 を 持 つ こ と も 求 め て い な い 。 し た が っ て 、 移 植 性 が 必 要 な ア プ リ ケ ー シ ョ ン で は 、 両 方 の 可 能 性 を 確 認 す べ き で あ る 。

EBADF

fd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い か 書 き 込 み の た め に オ ー プ ン (open) さ れ て い な い 。

EDESTADDRREQ

fd が 、 connect(2) を 使 っ て 通 信 相 手 の ア ド レ ス が 設 定 さ れ て い な い デ ー タ グ ラ ム ソ ケ ッ ト を 参 照 し て い る 。

EDQUOT

fd が 参 照 す る フ ァ イ ル を 含 む フ ァ イ ル シ ス テ ム の デ ィ ス ク ブ ロ ッ ク の ユ ー ザ ー ク ォ ー タ の 上 限 に 達 し て い る 。

EFAULT

buf が ア ク セ ス 可 能 な ア ド レ ス 空 間 の 外 に あ る 。

EFBIG

実 装 定 義 の 最 大 フ ァ イ ル サ イ ズ ま た は プ ロ セ ス の フ ァ イ ル サ イ ズ 制 限 を 超 え て フ ァ イ ル に 書 き 込 も う と し た 。 ま た は 許 可 さ れ た オ フ セ ッ ト 値 の 限 界 を 超 え た 先 の 位 置 に 書 き 込 も う と し た 。

(interrupt)。

EINTR 何 の デ ー タ も 書 か な い 間 に シ グ ナ ル に よ り 割 り 込 ま れ た

signal(7) 参 照 。

EINVAL

fd が 書 き 込 み が 不 適 切 な オ ブ ジ ェ ク ト を 参 照 し て い る 。 も し く は 、 フ ァ イ ル が O_DIRECT フ ラ グ を 指 定 し て オ ー プ ン さ れ て い る が 、 buf に 指 定 さ れ た ア ド レ ス 、 count に 指 定 さ れ た 値 、 現 在 の フ ァ イ ル オ フ セ ッ ト の い ず れ か の ア ラ イ ン メ ン ト が 不 適 切 で あ る 。

EIO

inode の 修 正 中 に 低 レ べ ル (low−level) I/O エ ラ ー が 発 生 し た 。

ENOSPC

fd に よ っ て 参 照 さ れ る フ ァ イ ル を 含 む デ バ イ ス (device) に 十 分 な 空 き が な い 。

EPERM

操 作 が file seal に よ り 禁 止 さ れ て い る 。 fcntl(2) 参 照 。
EPIPE

fd が パ イ プ (pipe) か ソ ケ ッ ト (socket) に 接 続 さ れ て お り 、 そ の 反 対 側 (読 み 込 み 側 ) が ク ロ ー ズ (close) さ れ て い る 。 こ れ が 発 生 し た 場 合 に は 、 書 き 込 み を 行 な う プ ロ セ ス は SIGPIPE シ グ ナ ル (signal)も 受 け る 。 (し た が っ て 、 プ ロ グ ラ ム が こ の シ グ ナ ル を 捕 獲 (catch)、 停 止 (block)、 無 視 (ignore) し た 場 合 の み 、 write の 返 り 値 を 参 照 で き る 。 )

fd に 接 続 さ れ た オ ブ ジ ェ ク ト に よ っ て は 、 他 の エ ラ ー が 起 こ る か も し れ な い 。

準 拠

SVr4, 4.3BSD, POSIX.1−2001.

SVr4 で は write が 割 り 込 ま れ る と 、 デ ー タ が 書 き 込 ま れ る 直 前 で は な く 、 そ の 時 点 で EINTR が 返 る 。

注 意

write() が 成 功 し て 返 っ て き て も 、 デ ー タ が デ ィ ス ク に 記 録 さ れ た こ と を 保 証 す る も の で は な い 。 実 際 、 デ ー タ の た め の ス ペ ー ス が 確 保 さ れ た こ と す ら 保 証 さ れ な い と い う バ グ っ ぽ い 実 装 も あ る 。 こ れ を 確 実 に す る 唯 一 の 方 法 は 、 全 て の デ ー タ を write し た 後 に fsync(2) を 呼 び 出 す こ と で あ る 。

write() が 1 バ イ ト も 書 き 込 ま な い う ち に シ グ ナ ル ハ ン ド ラ ー に よ り 割 り 込 ま れ た 場 合 、 write() は エ ラ ー EINTR で 失 敗 す る 。 1バ イ ト で も 書 き 込 ん だ 後 で 割 り 込 ま れ た 場 合 に は 、 write() は 成 功 し 、 書 き 込 ん だ バ イ ト 数 を 返 す 。

バ グ

POSIX.1−2008/SUSv4 セ ク シ ョ ン XSI 2.9.7 ("Thread Interactions with Regular File Operations") に よ る と 、 以 下 の す べ て の 関 数 で は 、 通 常 フ ァ イ ル も し く は シ ン ボ リ ッ ク リ ン ク に 対 す る 操 作 で は POSIX.1−2008 で 規 定 さ れ た 効 果 が 互 い に ア ト ミ ッ ク に 行 わ れ な け れ ば な ら な い : ... こ の 後 に 書 か れ て い る API の 中 に write() と writev(2) で あ る 。 ス レ ッ ド ( や プ ロ セ ス ) 間 で ア ト ミ ッ ク に 適 用 す る こ と が 求 め ら れ る 効 果 の 一 つ と し て 、 フ ァ イ ル オ フ セ ッ ト の 更 新 が あ る 。 し か し な が ら 、 バ ー ジ ョ ン 3.14 よ り 前 の Linux で は 、 こ の 限 り で は な い 。 オ ー プ ン フ ァ イ ル 記 述 (open file description) を 共 有 す る 2 つ の プ ロ セ ス が 同 時 に write() (や writev(2)) を 実 行 し た 場 合 、 こ の I/O 操 作 で は フ ァ イ ル オ フ セ ッ ト の 更 新 に 関 し て は ア ト ミ ッ ク で は な く 、 2 つ の プ ロ セ ス か ら 出 力 さ れ る デ ー タ ブ ロ ッ ク が (間 違 っ て ) 重 な る 可 能 性 が あ る 。 こ の 問 題 は Linux 3.14 で 修 正 さ れ た 。

関 連 項 目

close(2), fcntl(2), fsync(2), ioctl(2), lseek(2), open(2), pwrite(2), read(2), select(2), writev(2), fwrite(3)

こ の 文 書 に つ い て

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