名前
truncate, ftruncate - 指定した長さにファイルを切り詰める
書式
#include <unistd.h> #include <sys/types.h>
int truncate(const char *path, off_t length); int ftruncate(int fd, off_t length);
説明
truncate() は path で指定されるファイルを、 ftruncate() は fd で参照されるファイルを length バイトの長さになるように延長する、もしくは切り詰める。 もし切り詰める前のファイルが length より長ければ、length バイトを越える部分のデータは失われる。 もし切り詰める前のファイルが length より短かければ、伸張される。 伸張された部分を読んだ場合は NULL バイト (\0) の列が返される。
ファイルオフセットは変更されない。
大きさが変更されると、ファイルの st_ctime と st_mtime フィールド (それぞれ最終状態変更時刻、最終修正時刻; stat(2) 参照) が更新される。 また、set-user-ID と set-group-ID の許可ビットがクリアされるかもしれない。
ftruncate() の場合、ファイルは書き込み用に開いていなければならない。 truncate() の場合、ファイルは書き込み可能でなければならない。
返り値
成功した場合 0 が返る。失敗した場合 -1 が返り、 errno がエラーの内容に従って設定される。
エラー
truncate() では以下のエラーコードが定義されている。
EACCES | パスで指定されているディレクトリに検索許可のないものがある (訳注:x ビットが立っていない)。 あるいは、指定されたファイルに対する書き込み許可を持っていない。 (path_resolution(7) も参照のこと) |
EFAULT | path がプロセスに割り当てられているアドレス空間外を指している。 |
EFBIG | 引き数 length が最大ファイルサイズより大きい。(XSI) |
EINTR | 実行中にシグナルを受けた。 |
EINVAL | 引き数 length が負数であるか、最大ファイルサイズより大きい。 |
EIO | inode の更新時に I/O エラーが発生した。 |
EISDIR | 指定されたファイルはディレクトリである。 |
ELOOP | パス名を解釈する際にシンボリックリンクが多すぎた。 |
ENAMETOOLONG | |
パス名中のディレクトリ名が 255 文字を越えている、もしくはパス名全体が 1023 文字を越えている。 | |
ENOENT | 指定された名前のファイルが存在しない。 |
ENOTDIR | |
パス名中の項目にディレクトリではないものが入っている。 | |
EPERM | 下層にあるファイルシステムでは、現在のファイル長を越えて ファイルを伸長することができない。 |
EROFS | 指定されたファイルは読み出し専用のファイルシステム中にある。 |
ETXTBSY | |
指定されたファイルは実行されているファイルである。 | |
ftruncate() にも同様のエラーが適用される。 但し、 path に関するエラーの場合は代わりに fd に関するエラーとなる。 | |
EBADF | fd が無効なディスクリプター(descripter)である。 |
EBADF または EINVAL | |
fd で指定されているものが書き込みモードで開かれていない。 | |
EINVAL | fd が通常のファイルを参照していない。 |
準拠
4.4BSD, SVr4, POSIX.1-2001 (これらのコールは 4.2BSD で初めて登場した)。
注意
上記の記述は XSI 準拠のシステムのものである。 XSI 非準拠のシステムの場合、POSIX 標準は ftruncate() に対して length がファイルの長さより長かった場合、 エラーを返すかファイルを伸張するかの二つの動作を許容している。 truncate() に対しては全く規定されていない。 ほとんどの Unix 実装と同様、Linux はネイティブ (Linux 由来) の ファイルシステムの扱いでは XSI 要求仕様にしたがっている。 しかしながら、いくつかの非ネイティブのファイルシステムでは、 truncate() や ftruncate() を使って現在のファイル長を越えてファイルを伸長することができない。 Linux での有名な例としては VFAT がある。