truncate
Section: System Calls (2)
Updated: 2026-04-12
Index
JM Home Page
roff page
名前
truncate, ftruncate - 指定した長さにファイルを切り詰める
ライブラリ
標準 C ライブラリ (libc,~-lc)
書式
#include <unistd.h>
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
truncate():
_XOPEN_SOURCE >= 500
|| /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
|| /* glibc <= 2.19: */ _BSD_SOURCE
ftruncate():
_XOPEN_SOURCE >= 500
|| /* Since glibc 2.3.5: */ _POSIX_C_SOURCE >= 200112L
|| /* glibc <= 2.19: */ _BSD_SOURCE
説明
truncate() は path で指定されるファイルを、 ftruncate() は fd で参照されるファイルを
length バイトの長さになるように延長する、もしくは切り詰める。
If the file previously was larger than this size, the extra data is lost.
If the file previously was shorter, it is extended, and the extended part
reads as null bytes ('\0').
ファイルオフセットは変更されない。
大きさが変更されると、ファイルの st_ctime と st_mtime フィールド (それぞれ最終状態変更時刻、最終修正時刻; inode(7)
参照) が更新される。 また、set-user-ID と set-group-ID のモードビットがクリアされるかもしれない。
ftruncate() の場合、ファイルは書き込み用に開いていなければならない。 truncate()
の場合、ファイルは書き込み可能でなければならない。
返り値
On success, zero is returned. On error, -1 is returned, and errno is set
to indicate the error.
エラー
truncate() では以下のエラーコードが定義されている。
- EACCES
-
パスで指定されているディレクトリに検索許可のないものがある (訳注:x ビットが立っていない)。
あるいは、指定されたファイルに対する書き込み許可を持っていない。 (path_resolution(7) も参照のこと)
- EFAULT
-
引数 path がプロセスに割り当てられているアドレス空間外を指している。
- EFBIG
-
The argument length is larger than the maximum file size. (XSI)
- ENOSPC
-
There is not enough space left on the device for extending the file size to
the given length.
- EINTR
-
完了待ちで停止 (block) している間に、呼び出しが シグナルハンドラーにより割り込まれた。 fcntl(2) と signal(7)
を参照。
- EINVAL
-
引数 length が負数であるか、最大ファイルサイズより大きい。
- EIO
-
inode の更新時に I/O エラーが発生した。
- EISDIR
-
指定されたファイルはディレクトリである。
- ELOOP
-
パス名を解釈する際にシンボリックリンクが多すぎた。
- ENAMETOOLONG
-
パス名中のディレクトリ名が 255 文字を越えている、もしくはパス名全体が 1023 文字を越えている。
- ENOENT
-
指定された名前のファイルが存在しない。
- ENOTDIR
-
パス名の構成要素がディレクトリではない。
- EPERM
-
下層にあるファイルシステムでは、現在のファイル長を越えて ファイルを伸長することができない。
- EPERM
-
操作が file seal により禁止されている。 fcntl(2) 参照。
- EROFS
-
ファイルが読み込み専用 (read only) のファイルシステム上にある。
- ETXTBSY
-
ファイルが実行中の実行ファイルである。
ftruncate() にも同様のエラーが適用される。 但し、 path に関するエラーの場合は、ファイルディスクリプター fd
に関するエラーとなる。
- EBADF
-
fd が適切なファイルディスクリプターでない。
- EBADF または EINVAL
-
fd で指定されているものが書き込みモードで開かれていない。
- EINVAL
-
fd does not reference a regular file or a POSIX shared memory object.
- EINVAL または EBADF
-
The file descriptor fd is not open for writing. POSIX permits, and
portable applications should handle, either error for this case. (Linux
produces EINVAL.)
バージョン
「説明」の節で述べた詳細は XSI 準拠のシステムについてのものである。
XSI 非準拠のシステムの場合、POSIX 標準は ftruncate() に対して length が
ファイルの長さより長かった場合、 エラーを返すかファイルを伸張するかの二つの
動作を許容している。 truncate() に対しては全く規定されていない。
ほとんどの UNIX 実装と同様、Linux はネイティブ (Linux 由来) の ファイルシステム
の扱いでは XSI 要求仕様にしたがっている。 しかしながら、いくつかの非ネイティブ
のファイルシステムでは、 truncate() や ftruncate() を使って現在のファイル
長を越えてファイルを伸長することができない。 Linux での有名な例としては
VFAT がある。
いくつかの 32 ビットアーキテクチャーでは、これらのシステムコールの呼び出し時のシグネチャーが違っています。理由は syscall(2)
で説明されている通りです。
標準規格
POSIX.1-2024.
歴史
POSIX.1-2001, SVr4, 4.3BSD.
元々の Linux の truncate() と ftruncate() システムコールは
大きなファイルオフセットを扱えるように設計されていなかった。
その結果、大きなファイルファイルを扱うことができる truncate64() と ftruncate64()
システムコールが Linux 2.4 で追加された。
ただし、glibc を使ったアプリケーションではこれらの詳細は気にする必要はない。
glibc のラッパー関数は新しいシステムコールが利用できる場合にはそれらを利用する
ようになっているからである。
注意
ftruncate() can also be used to set the size of a POSIX shared memory
object; see shm_open(3).
バグ
glibc 2.12 のヘッダーファイルにはバグがあり、 ftruncate() の宣言を公開するのに必要な
_POSIX_C_SOURCE の最小値が 200112L ではなく 200809L となっていた。 このバグは、これ以降のバージョンの
glibc では修正されている。
関連項目
truncate(1), open(2), stat(2), path_resolution(7)
Index
- 名前
-
- ライブラリ
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- バージョン
-
- 標準規格
-
- 歴史
-
- 注意
-
- バグ
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.