TRUNCATE
Section: Linux Programmer's Manual (2)
Updated: 2019-03-06
Index
JM Home Page
roff page
名前
truncate, ftruncate - 指定した長さにファイルを切り詰める
書式
#include <unistd.h>
#include <sys/types.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
|| /* glibc 2.12 以降: */ _POSIX_C_SOURCE >= 200809L
|| /* glibc 2.19 以前: */ _BSD_SOURCE
ftruncate():
-
_XOPEN_SOURCE >= 500
|| /* glibc 2.3.5 以降: */ _POSIX_C_SOURCE >= 200112L
|| /* glibc 2.19 以前: */ _BSD_SOURCE
説明
truncate() は path で指定されるファイルを、 ftruncate() は fd で参照されるファイルを
length バイトの長さになるように延長する、もしくは切り詰める。
もし切り詰める前のファイルが length より長ければ、length バイトを越える部分のデータは失われる。 もし切り詰める前のファイルが
length より短かければ、伸張される。 伸張された部分を読んだ場合はヌルバイト ('\0') の列が返される。
ファイルオフセットは変更されない。
大きさが変更されると、ファイルの st_ctime と st_mtime フィールド (それぞれ最終状態変更時刻、最終修正時刻; inode(7)
参照) が更新される。 また、set-user-ID と set-group-ID のモードビットがクリアされるかもしれない。
ftruncate() の場合、ファイルは書き込み用に開いていなければならない。 truncate()
の場合、ファイルは書き込み可能でなければならない。
返り値
成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。
エラー
truncate() では以下のエラーコードが定義されている。
- EACCES
-
パスで指定されているディレクトリに検索許可のないものがある (訳注:x ビットが立っていない)。
あるいは、指定されたファイルに対する書き込み許可を持っていない。 (path_resolution(7) も参照のこと)
- EFAULT
-
引数 path がプロセスに割り当てられているアドレス空間外を指している。
- EFBIG
-
引数 length が最大ファイルサイズより大きい。(XSI)
- 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.)
準拠
POSIX.1-2001, POSIX.1-2008, 4.4BSD, SVr4 (これらのコールは 4.2BSD で初めて登場した)。
注意
ftruncate() can also be used to set the size of a POSIX shared memory
object; see shm_open(3).
「説明」の節で述べた詳細は XSI 準拠のシステムについてのものである。
XSI 非準拠のシステムの場合、POSIX 標準は ftruncate() に対して length が
ファイルの長さより長かった場合、 エラーを返すかファイルを伸張するかの二つの
動作を許容している。 truncate() に対しては全く規定されていない。
ほとんどの UNIX 実装と同様、Linux はネイティブ (Linux 由来) の ファイルシステム
の扱いでは XSI 要求仕様にしたがっている。 しかしながら、いくつかの非ネイティブ
のファイルシステムでは、 truncate() や ftruncate() を使って現在のファイル
長を越えてファイルを伸長することができない。 Linux での有名な例としては
VFAT がある。
元々の Linux の truncate() と ftruncate() システムコールは
大きなファイルオフセットを扱えるように設計されていなかった。
その結果、大きなファイルファイルを扱うことができる truncate64() と ftruncate64()
システムコールが Linux 2.4 で追加された。
ただし、glibc を使ったアプリケーションではこれらの詳細は気にする必要はない。
glibc のラッパー関数は新しいシステムコールが利用できる場合にはそれらを利用する
ようになっているからである。
いくつかの 32 ビットアーキテクチャーでは、これらのシステムコールの呼び出し時のシグネチャーが違っています。理由は syscall(2)
で説明されている通りです。
バグ
glibc 2.12 のヘッダーファイルにはバグがあり、 ftruncate() の宣言を公開するのに必要な
_POSIX_C_SOURCE の最小値が 200112L ではなく 200809L となっていた。 このバグは、これ以降のバージョンの
glibc では修正されている。
関連項目
truncate(1), open(2), stat(2), path_resolution(7)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/ に書かれている。
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- 準拠
-
- 注意
-
- バグ
-
- 関連項目
-
- この文書について
-
This document was created by
man2html,
using the manual pages.
Time: 03:33:35 GMT, December 05, 2022