TRUNCATE - Linux手册页
Linux程序员手册 第2部分
更新日期: 2019-03-06
名称
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版本
ftruncate():
- _XOPEN_SOURCE>= 500 || / *自glibc 2.3.5起:* / _POSIX_C_SOURCE>= 200112L || / * Glibc版本
说明
truncate()和ftruncate()函数使由path命名或由fd引用的常规文件被截断为恰好长度字节的大小。
如果文件以前大于此大小,则多余的数据将丢失。如果先前的文件较短,则将其扩展,并且扩展部分读取为空字节(aq \ 0aq)。
文件偏移量未更改。
如果更改了大小,则文件的st_ctime和st_mtime字段(分别是上次状态更改的时间和上次修改的时间;请参见inode(7))将更新,并设置用户ID和组ID。模式位可以清除。
使用ftruncate(),必须打开该文件以进行写入。使用truncate(),文件必须可写。
返回值
成功时,返回零。如果出错,则返回-1,并正确设置errno。
错误说明
对于truncate():
- EACCES
- 路径前缀的组成部分的搜索权限被拒绝,或者用户不能写该命名文件。 (另请参见path_resolution(7)。)
- EFAULT
- 参数路径指向进程分配的地址空间之外。
- EFBIG
- 参数长度大于最大文件大小。 (XSI)
- EINTR
- 在等待完成的过程中,呼叫被信号处理程序中断;参见fcntl(2)和signal(7)。
- EINVAL
- 参数长度为负数或大于最大文件大小。
- EIO
- 更新索引节点时发生I / O错误。
- EISDIR
- 命名文件是一个目录。
- ELOOP
- 翻译路径名时遇到太多符号链接。
- ENAMETOOLONG
- 路径名的一部分超过255个字符,或者整个路径名超过1023个字符。
- ENOENT
- 命名文件不存在。
- ENOTDIR
- 路径前缀的组成部分不是目录。
- EPERM
- 基础文件系统不支持将文件扩展到其当前大小之外。
- EPERM
- 该操作被文件封条阻止;参见fcntl(2)。
- EROFS
- 命名文件驻留在只读文件系统上。
- ETXTBSY
- 该文件是正在执行的可执行文件。
对于ftruncate(),将应用相同的错误,但现在有了文件描述符fd可能导致错误的东西,而不是路径可能出错的东西:
- EBADF
- fd不是有效的文件描述符。
- EBADFor EINVAL
- fd不开放编写。
- EINVAL
- fd不引用常规文件或POSIX共享内存对象。
- EINVALor EBADF
- 文件描述符fd未打开以进行写入。 POSIX许可,并且便携式应用程序应处理这种情况下的两种错误。 (Linux产生EINVAL。)
遵循规范
POSIX.1-2001,POSIX.1-2008、4.4BSD,SVr4(这些调用首先出现在4.2BSD中)。
备注
ftruncate()也可用于设置POSIX共享内存对象的大小;参见shm_open(3)。
DESCRIPTION中的详细信息适用于符合XSI的系统。对于不符合XSI的系统,当长度超过文件长度(注意,在这种环境下根本未指定truncate())时,POSIX标准允许ftruncate()采取两种行为:返回错误或扩展文件。像大多数UNIX实现一样,Linux在处理本机文件系统时遵循XSI要求。但是,某些非本机文件系统不允许使用truncate()和ftruncate()将文件扩展到其当前长度之外:Linux上的一个著名示例是VFAT。
原始的Linux truncate()和ftruncate()系统调用不是设计来处理大文件偏移量的。因此,Linux 2.4添加了处理大文件的truncate64()和ftruncate64()系统调用。但是,使用glibc的应用程序可以忽略这些详细信息,这些应用程序的包装函数透明地使用可用的最新系统调用。
在某些32位体系结构上,由于syscall(2)中描述的原因,这些系统调用的调用签名不同。
BUGS
glibc 2.12中的头文件错误意味着公开ftruncate()声明所需的_POSIX_C_SOURCE的最小值为200809L,而不是200112L。此问题已在更高版本的glibc中修复。
另外参见
截断(1),打开(2),状态(2),路径分辨率(7)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。