truncate , truncate64, ftruncate 或 ftruncate64 子例程

用途

更改常规文件或者共享内存对象的长度。

标准 C 库 (libc.a)

语法

#include <unistd.h>
int truncate ( Path,  Length)
const   char *Path;
off_t Length;
int ftruncate ( FileDescriptor, Length)
int FileDescriptor;
off_t Length;
int truncate64 ( Path,  Length)
const   char *Path;
off64_t Length;
int ftruncate64 ( FileDescriptor, Length)
int FileDescriptor;
off64_t Length;

描述

截断截断 子例程会更改常规文件或共享内存对象的长度。

路径 参数必须指向调用过程对其具有写许可权的常规文件。 长度 参数指定新文件的所需长度 (以字节为单位)。

长度 参数测量从文件开头开始的指定文件 (以字节为单位)。 如果新长度小于前一个长度,那么将除去新长度与前一个文件结尾之间的所有数据。 如果指定文件中的新长度大于先前的长度,那么旧长度与新长度之间的数据将读取为零。 完整的块将返回到文件系统,以便可以再次使用这些块,并且文件大小将更改为 长度 参数的值。

如果 路径 参数中指定的文件命名了符号链接,那么将遍历该链接并继续进行路径名解析。

这些子例程不会修改该文件的寻道指针。

不能将这些子例程应用到进程已使用 0-DEFER 标志打开的文件。

成功完成 truncateftruncate 子例程将更新文件的 st_ctimest_mtime 字段。 如果以下情况为真,成功完成后还会清除文件的SetUserID位(S_ISUID):

  • 调用过程不具有 root 用户权限。
  • 调用进程的有效用户标识与该文件的用户标识不匹配。
  • 该文件可由组 (_IXGRP) 或其他 (_IXOTH) 执行。

如果下列条件为真,这些子程序还会清除SetGroupID(S_ISGID):

  • 该文件与进程的有效组标识或其中一个辅助组标识不匹配
  • 该文件可由所有者 ((_IXUSR)) 或其他用户 (_IXOTH) 执行。
    注意:即使子程序失败,也会清除SetUserIDSetGroupID位,因为文件中的数据在检测到错误之前已被修改。

可以使用 截断截断 来指定最大为 最大偏移量的任何大小。 可以使用 truncate64ftruncate64 来指定文件的最大文件大小的任意长度。

在支持大型文件的编程环境中, 截断 将重新定义为 truncate64 截断 将重新定义为 ftruncate64

参数

描述
路径 指定将打开,截断然后关闭的文件的名称。
FileDescriptor 指定必须打开以进行写操作的文件或共享内存对象的描述符。
长度 指定截断文件的新长度 (以字节为单位)。

返回值

在成功完成后,将返回值 0。 如果 截断 截断 子例程不成功,那么将返回 -1 值,并设置 错误号 全局变量以指示错误的性质。

错误代码

如果以下情况成立,那么 截断截断 子例程将失败:

描述
EROFS 已尝试截断占用只读文件系统的文件。
注: 此外,如果在打开文件时发生问题,那么 截断 子例程可以返回与 子例程相同的错误。

如果下列其中一项为 true ,那么 截断 截断 子例程将失败:

描述
EAGAIN 如果对正在截断的文件的某个部分强制写锁定,那么截断操作将失败。 因为目标文件是在设置了 O_NONBLOCKO_NDELAY 标志的情况下打开的,所以子例程立即失败,而不是等待释放。
EDQUOT 无法为截断的文件分配新的磁盘块。 在目标文件系统上,用户或组的分配磁盘块的配额已耗尽。
EFBIG 尝试写入超过进程文件大小限制或文件大小最大限制的文件。 如果在执行进程之前设置用户环境变量 XPG_SUS_ENV=ON ,那么当 SIGXFSZ 信号超过进程的文件大小限制时,会将该信号发布到进程。
EFBIG 该文件是常规文件,并且 长度 大于与 菲尔德斯关联的开放式文件描述中建立的最大偏移量。
EINVAL 该文件不是一个常规文件。
EINVAL 长度 参数值小于零。
EISDIR 指定的文件是目录。
EINTR 执行期间捕获到信号。
EIO 从文件系统读取或写入文件系统时发生 I/O 错误。
电子文件 该文件由一个或多个进程使用 0-DEFER 打开。
ENOSPC 无法为截断的文件分配新的磁盘块。 在包含该文件的文件系统上,没有可用空间。
ETXTBSY 该文件是正在运行的进程的一部分。
EROFS 指定的文件占用只读文件系统。
注意:
  1. 由于其他原因, 截断 子例程也可能不成功。 有关更多错误的列表,请参阅 需要进行路径名解析的服务的基本操作系统错误代码
  2. 如果在打开文件时发生问题,那么 截断 子例程可能会返回与 子例程相同的错误。

如果以下情况成立, 截断 子例程将失败:

描述
EBADF FileDescriptor 参数不是打开用于写入的有效文件描述符。
EINVAL FileDescriptor 参数引用在没有写许可权的情况下打开的文件。

如果满足以下条件,那么 截断 函数将失败:

描述
EACCES 路径前缀的某个组件拒绝搜索许可权,或者文件上的写许可权被拒绝。
EISDIR 指定的文件是目录。
ELOOP 解析 路径时迂到过多的符号链接。
ENAMETOOLONG 指定路径名的长度超过 PATH_MAX 个字节,或者路径名的某个组件的长度超过 NAME_MAX 个字节。
ENOENT 路径 的组件未对现有文件进行命名,或者 路径 为空字符串。
ENTTIR 路径前缀为 路径 的组件不是目录。
EROFS 指定的文件占用只读文件系统。  

如果满足以下条件,那么 截断 函数将失败:

描述
ENAMETOOLONG 符号链接的路径名解析生成了长度超过 PATH_MAX的中间结果。