名称

truncate, ftruncate-将文件截断为指定的长度

BUGS

glibc 2.12中的头文件错误意味着公开ftruncate()声明所需的_POSIX_C_SOURCE的最小值为200809L,而不是200112L。此问题已在更高版本的glibc中修复。

语法

#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版本

返回值

成功时,返回零。如果出错,则返回-1,并正确设置errno。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

TRUNCATE - Linux手册页

Linux程序员手册 第2部分
更新日期: 2019-03-06

遵循规范

POSIX.1-2001,POSIX.1-2008、4.4BSD,SVr4(这些调用首先出现在4.2BSD中)。

错误说明

对于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。)

说明

truncate()和ftruncate()函数使由path命名或由fd引用的常规文件被截断为恰好长度字节的大小。

如果文件以前大于此大小,则多余的数据将丢失。如果先前的文件较短,则将其扩展,并且扩展部分读取为空字节(aq \ 0aq)。

文件偏移量未更改。

如果更改了大小,则文件的st_ctime和st_mtime字段(分别是上次状态更改的时间和上次修改的时间;请参见inode(7))将更新,并设置用户ID和组ID。模式位可以清除。

使用ftruncate(),必须打开该文件以进行写入。使用truncate(),文件必须可写。

另外参见

截断(1),打开(2),状态(2),路径分辨率(7)

备注

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)中描述的原因,这些系统调用的调用签名不同。

日期:2019-08-20 17:59:35 来源:oir作者:oir