truncate(2) – Linux manual page (man7.org)
truncate, ftruncate - truncate(截断) a file to a specified length
#include <unistd.h>
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
Feature Test Macro Requirements for glibc (see
feature_test_macros(7)):
truncate():
_XOPEN_SOURCE >= 500
|| /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
|| /* Glibc <= 2.19: */ _BSD_SOURCE
ftruncate():
_XOPEN_SOURCE >= 500
|| /* Since glibc 2.3.5: */ _POSIX_C_SOURCE >= 200112L
|| /* Glibc <= 2.19: */ _BSD_SOURCE
truncate() 和 ftruncate() 函数导致由 path 命名或由 fd 引用的常规文件被截断为精确长度字节的大小。
如果文件以前大于length,则多余的数据将丢失。 如果文件先前较短,则将其扩展,扩展部分读取为空字节 (‘\0’)。
文件偏移量没有改变。
如果大小更改,更新文件的 st_ctime 和 st_mtime 字段(分别为上次状态更改的时间和上次修改的时间;请参阅 inode(7))将被更新,同时 set-user-ID 和 set-group-ID 模式位可能被被清除。
使用 ftruncate(),文件必须打开才能写入; 使用 truncate(),文件必须是可写的。
成功时,返回零。 出错时返回 -1,并设置 errno 以指示错误。
For truncate():
- EACCES 路径前缀目录的搜索权限被拒绝,或者用户不可写指定文件。 (另见 path_resolution(7)。)
- EFAULT 参数path指向进程分配的地址空间之外。
- EFBIG 参数length大于最大文件大小。 (XSI)
- EINTR 在阻塞等待完成时,调用被信号处理程序中断; 参见 fcntl(2) 和 signal(7)。
- EINVAL 参数长度为负数或大于最大文件大小。
- EIO 更新 inode 时发生 I/O 错误。
- EISDIR 路径指向目录。
- ELOOP 翻译路径名时遇到太多符号链接。
- ENAMETOOLONG 路径名的组成部分超过 255 个字符,或整个路径名超过 1023 个字符。
- ENOENT 文件不存在
- ENOTDIR 路径其中一个前缀不是目录
- EPERM 底层文件系统不支持扩展文件超出其当前大小。
- EPERM 文件seal阻止了该操作; 参见 fcntl(2)。
- EROFS 文件是只读的
- ETXTBSY 该文件是正在执行的可执行文件。
对于 ftruncate(),同样的错误适用,但不是路径可能有问题,而是文件描述符 fd 可能有问题:
- EBADF fd不可用
- EBADF or EINVAL fd 不可写
- EINVAL fd不指向常规的文件或者共享内存对象
- EINVAL or EBADF 文件描述符 fd 未打开以进行写入。 POSIX 允许并且可移植应用程序应该处理这种情况下的任何错误。 (Linux 产生 EINVAL。)
POSIX.1-2001, POSIX.1-2008, 4.4BSD, SVr4 (these calls first appeared in 4.2BSD).
ftruncate() 也可用于设置 POSIX 共享内存对象的大小; 参见 shm_open(3)。
DESCRIPTION中的详细信息适用于符合 XSI 的系统。 对于非 XSI 兼容的系统,当长度超过文件长度时,POSIX 标准允许 ftruncate() 的两种行为(请注意,在这种环境中根本没有指定 truncate()):返回错误或扩展文件 . 与大多数 UNIX 实现一样,Linux 在处理本机文件系统时遵循 XSI 要求。 然而,一些非本地文件系统不允许使用 truncate() 和 ftruncate() 来扩展文件超出其当前长度:Linux 上一个值得注意的例子是 VFAT
最初的 Linux truncate() 和 ftruncate() 系统调用不是为处理大文件偏移而设计的。 因此,Linux 2.4 添加了处理大文件的 truncate64() 和 ftruncate64() 系统调用。 但是,使用 glibc 的应用程序可以忽略这些细节,其包装函数透明地使用可用的最新系统调用。
在某些 32 位架构上,这些系统调用的调用签名不同,原因在 syscall(2) 中描述。
glibc 2.12 中的一个头文件错误意味着公开 ftruncate() 声明所需的 _POSIX_C_SOURCE 的最小值是 200809L 而不是 200112L。 这已在以后的 glibc 版本中得到修复。
Pingback:Linux手册翻译 —— shm_overview(7) – Kingdo Station