文件IO_文件截断_ftruncate,truncate(附Linux-5.15.10内核源码分析)
发布人:shili8
发布时间:2025-02-07 00:21
阅读次数:0
**文件IO_文件截断_ftruncate,truncate**
在 Linux 中,`ftruncate()` 和 `truncate()` 是两个用于截断文件的系统调用。它们允许用户在打开一个文件后改变其大小。这一功能对于管理磁盘空间至关重要。
###1. ftruncate()
`ftruncate()` 是一个用于截断已打开文件的函数,它接受两个参数:文件描述符 `fd` 和新长度 `length`。如果成功,返回值为0;否则,返回 `-1`。
cint ftruncate(int fd, off_t length);
**示例代码**
c#include <stdio.h>
#include <fcntl.h>
int main() {
int fd = open("test.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
if (fd == -1) {
perror("open");
return1;
}
// 将文件长度设置为10 个字节 if (ftruncate(fd,10) !=0) {
perror("ftruncate");
close(fd);
return1;
}
close(fd);
return0;
}
在上面的示例中,我们首先使用 `open()` 函数打开一个名为 "test.txt" 的文件,并将其长度设置为10 个字节。
###2. truncate()
`truncate()` 是用于截断未打开的文件的函数,它接受两个参数:文件路径 `path` 和新长度 `length`。如果成功,返回值为0;否则,返回 `-1`。
cint truncate(const char *path, off_t length);
**示例代码**
c#include <stdio.h>
#include <unistd.h>
int main() {
// 将文件长度设置为10 个字节 if (truncate("test.txt",10) !=0) {
perror("truncate");
return1;
}
return0;
}
在上面的示例中,我们直接使用 `truncate()` 函数将 "test.txt" 文件的长度设置为10 个字节。
### Linux-5.15.10内核源码分析#### ftruncate()
`ftruncate()` 的实现位于 `fs/fcntl.c` 文件中:
cSYSCALL_DEFINE1(ftruncate, int, fd, unsigned long, length)
{
struct file *file;
loff_t new_size;
if (fd < 0 || fd >= NR_OPEN_DEFAULT)
return -EBADF;
file = get_file(fd);
if (!file)
return -EBADF;
new_size = (loff_t)length;
if (file->f_op->ftruncate)
return file->f_op->ftruncate(file, new_size);
return -EIO;
}
在上面的代码中,我们首先检查文件描述符 `fd` 是否有效,然后获取对应的文件结构体 `file`。如果文件操作函数 `ftruncate()` 存在,则调用它;否则,返回 `-EIO`。
#### truncate()
`truncate()` 的实现位于 `fs/truncate.c` 文件中:
cSYSCALL_DEFINE2(truncate, const char __user *, path, unsigned long, length)
{
struct dentry *dentry;
int error;
if (length < 0)
return -EINVAL;
dentry = lookup_dentry(path);
if (!dentry)
return -ENOENT;
error = security_truncate(dentry, length);
if (error)
return error;
error = generic_truncate(dentry, length);
if (error)
return error;
return0;
}
在上面的代码中,我们首先检查新长度 `length` 是否有效,然后查找文件的 dentry 结构体。如果找到,则调用安全函数 `security_truncate()` 和通用函数 `generic_truncate()` 来截断文件。
综上所述,`ftruncate()` 和 `truncate()` 是两个用于截断文件的系统调用,它们允许用户在打开一个文件后改变其大小。它们的实现位于 Linux 内核源码中,并且提供了对磁盘空间管理的支持。

