kazmax - Linux で自宅サーバー

truncate - システムコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 返り値
  5. エラー
  6. 準拠
  7. 注意
  8. 関連項目

名前

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 (2)も参照のこと)
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 がある。

関連項目