#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFFER_SIZE 4096
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: %s <source_file> <destination_file>\n", argv[0]);
return 1;
}
int source_fd = open(argv[1], O_RDONLY);
if (source_fd == -1) {
perror("Failed to open source file");
return 1;
}
int destination_fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (destination_fd == -1) {
perror("Failed to open destination file");
close(source_fd);
return 1;
}
char buffer[BUFFER_SIZE];
ssize_t bytes_read, bytes_written;
while ((bytes_read = pread(source_fd, buffer, BUFFER_SIZE, 0)) > 0) {
bytes_written = pwrite(destination_fd, buffer, bytes_read, 0);
if (bytes_written != bytes_read) {
perror("Failed to write to destination file");
close(source_fd);
close(destination_fd);
return 1;
}
}
if (bytes_read == -1) {
perror("Failed to read from source file");
close(source_fd);
close(destination_fd);
return 1;
}
close(source_fd);
close(destination_fd);
return 0;
}
这个程序通过pread()
函数从源文件中读取数据,并使用pwrite()
函数将数据写入目标文件。pread()
和pwrite()
函数可以指定文件偏移量,这样可以确保目标文件的空洞与源文件保持一致。
pread()
函数和pwrite()
函数是Linux系统提供的文件I/O函数,用于读取和写入文件中的数据。它们与read()
和write()
函数类似,但具有额外的参数,可以指定文件偏移量。
下面分别详细介绍pread()
函数和pwrite()
函数的使用方法:
pread()
函数
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
pread()
函数从指定文件描述符fd
所代表的文件中读取数据,将读取的数据存储到buf
指向的缓冲区中。count
参数指定要读取的字节数,offset
参数指定读取的起始位置。
fd
:文件描述符,用于标识要读取的文件。buf
:指向存储读取数据的缓冲区的指针。count
:要读取的字节数。offset
:读取的起始位置,即文件偏移量。
pread()
函数的返回值为实际读取的字节数,如果返回值为0,表示已到达文件末尾,如果返回值为-1,表示读取失败。
pwrite()
函数
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
pwrite()
函数将buf
指向的缓冲区中的数据写入到指定文件描述符fd
所代表的文件中。count
参数指定要写入的字节数,offset
参数指定写入的起始位置。
fd
:文件描述符,用于标识要写入的文件。buf
:指向要写入数据的缓冲区的指针。count
:要写入的字节数。offset
:写入的起始位置,即文件偏移量。
pwrite()
函数的返回值为实际写入的字节数,如果返回值为-1,表示写入失败。
使用pread()
和pwrite()
函数可以实现对文件的随机读写操作,可以指定读取和写入的起始位置,从而实现对文件中任意位置的数据读取和写入。这在处理文件空洞等特殊情况时非常有用。