Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

       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/ に書かれている。