truncate , truncate64, ftruncate 或 ftruncate64 子例程
用途
更改常规文件或者共享内存对象的长度。
库
标准 C 库 (libc.a)
语法
#include <unistd.h>
int ftruncate ( FileDescriptor, Length)
int FileDescriptor;
off_t Length;int ftruncate64 ( FileDescriptor, Length)
int FileDescriptor;
off64_t Length;描述
截断 和 截断 子例程会更改常规文件或共享内存对象的长度。
路径 参数必须指向调用过程对其具有写许可权的常规文件。 长度 参数指定新文件的所需长度 (以字节为单位)。
长度 参数测量从文件开头开始的指定文件 (以字节为单位)。 如果新长度小于前一个长度,那么将除去新长度与前一个文件结尾之间的所有数据。 如果指定文件中的新长度大于先前的长度,那么旧长度与新长度之间的数据将读取为零。 完整的块将返回到文件系统,以便可以再次使用这些块,并且文件大小将更改为 长度 参数的值。
如果 路径 参数中指定的文件命名了符号链接,那么将遍历该链接并继续进行路径名解析。
这些子例程不会修改该文件的寻道指针。
不能将这些子例程应用到进程已使用 0-DEFER 标志打开的文件。
成功完成 truncate 或 ftruncate 子例程将更新文件的 st_ctime 和 st_mtime 字段。 如果以下情况为真,成功完成后还会清除文件的SetUserID位(S_ISUID):
- 调用过程不具有 root 用户权限。
- 调用进程的有效用户标识与该文件的用户标识不匹配。
- 该文件可由组 (_IXGRP) 或其他 (_IXOTH) 执行。
如果下列条件为真,这些子程序还会清除SetGroupID位(S_ISGID):
- 该文件与进程的有效组标识或其中一个辅助组标识不匹配
- 或
- 该文件可由所有者 ((_IXUSR)) 或其他用户 (_IXOTH) 执行。注意:即使子程序失败,也会清除SetUserID和SetGroupID位,因为文件中的数据在检测到错误之前已被修改。
可以使用 截断 和 截断 来指定最大为 最大偏移量的任何大小。 可以使用 truncate64 和 ftruncate64 来指定文件的最大文件大小的任意长度。
在支持大型文件的编程环境中, 截断 将重新定义为 truncate64 , 截断 将重新定义为 ftruncate64。
参数
| 项 | 描述 |
|---|---|
| 路径 | 指定将打开,截断然后关闭的文件的名称。 |
| FileDescriptor | 指定必须打开以进行写操作的文件或共享内存对象的描述符。 |
| 长度 | 指定截断文件的新长度 (以字节为单位)。 |
返回值
在成功完成后,将返回值 0。 如果 截断 或 截断 子例程不成功,那么将返回 -1 值,并设置 错误号 全局变量以指示错误的性质。
错误代码
如果以下情况成立,那么 截断 和 截断 子例程将失败:
| 项 | 描述 |
|---|---|
| EROFS | 已尝试截断占用只读文件系统的文件。 |
如果下列其中一项为 true ,那么 截断 和 截断 子例程将失败:
| 项 | 描述 |
|---|---|
| EAGAIN | 如果对正在截断的文件的某个部分强制写锁定,那么截断操作将失败。 因为目标文件是在设置了 O_NONBLOCK 或 O_NDELAY 标志的情况下打开的,所以子例程立即失败,而不是等待释放。 |
| EDQUOT | 无法为截断的文件分配新的磁盘块。 在目标文件系统上,用户或组的分配磁盘块的配额已耗尽。 |
| EFBIG | 尝试写入超过进程文件大小限制或文件大小最大限制的文件。 如果在执行进程之前设置用户环境变量 XPG_SUS_ENV=ON ,那么当 SIGXFSZ 信号超过进程的文件大小限制时,会将该信号发布到进程。 |
| EFBIG | 该文件是常规文件,并且 长度 大于与 菲尔德斯关联的开放式文件描述中建立的最大偏移量。 |
| EINVAL | 该文件不是一个常规文件。 |
| EINVAL | 长度 参数值小于零。 |
| EISDIR | 指定的文件是目录。 |
| EINTR | 执行期间捕获到信号。 |
| EIO | 从文件系统读取或写入文件系统时发生 I/O 错误。 |
| 电子文件 | 该文件由一个或多个进程使用 0-DEFER 打开。 |
| ENOSPC | 无法为截断的文件分配新的磁盘块。 在包含该文件的文件系统上,没有可用空间。 |
| ETXTBSY | 该文件是正在运行的进程的一部分。 |
| EROFS | 指定的文件占用只读文件系统。 |
- 由于其他原因, 截断 子例程也可能不成功。 有关更多错误的列表,请参阅 需要进行路径名解析的服务的基本操作系统错误代码。
- 如果在打开文件时发生问题,那么 截断 子例程可能会返回与 开 子例程相同的错误。
如果以下情况成立, 截断 子例程将失败:
| 项 | 描述 |
|---|---|
| EBADF | FileDescriptor 参数不是打开用于写入的有效文件描述符。 |
| EINVAL | FileDescriptor 参数引用在没有写许可权的情况下打开的文件。 |
如果满足以下条件,那么 截断 函数将失败:
| 项 | 描述 |
|---|---|
| EACCES | 路径前缀的某个组件拒绝搜索许可权,或者文件上的写许可权被拒绝。 |
| EISDIR | 指定的文件是目录。 |
| ELOOP | 解析 路径时迂到过多的符号链接。 |
| ENAMETOOLONG | 指定路径名的长度超过 PATH_MAX 个字节,或者路径名的某个组件的长度超过 NAME_MAX 个字节。 |
| ENOENT | 路径 的组件未对现有文件进行命名,或者 路径 为空字符串。 |
| ENTTIR | 路径前缀为 路径 的组件不是目录。 |
| EROFS | 指定的文件占用只读文件系统。 |
如果满足以下条件,那么 截断 函数将失败:
| 项 | 描述 |
|---|---|
| ENAMETOOLONG | 符号链接的路径名解析生成了长度超过 PATH_MAX的中间结果。 |