系统调用实现文件复制程序故障求助:读取文件疑存问题
嘿,我懂你现在的挫败感——用系统调用做文件复制就算是printf打印缓冲区都搞不定,肯定是某个细节踩坑了!虽然你没贴出代码,但我可以给你列几个最容易出错的地方,你对照着排查下:
常见的系统调用文件复制错误点
- 文件打开参数搞错:比如用
O_WRONLY打开源文件(根本读不了),或者创建目标文件时没加O_CREAT参数(文件不存在直接报错),还有权限位没设置对——open的第三个参数要传0644这类合法权限,不然创建的文件可能连读写权限都没有。 - 没处理
read()/write()的返回值:这是最容易忽略的点!read()返回-1是出错,返回0是读到文件末尾;要是你没判断返回值,要么会一直循环读无效内容,要么根本没意识到自己没读到任何数据。另外write()可能无法一次性写完缓冲区内容,得循环调用直到所有字节都写入。 - 缓冲区打印方式不对:如果文件是二进制内容,用
printf("%s", buf)会遇到\0就停止打印,看起来像是缓冲区空的。换成write(STDOUT_FILENO, buf, nread)打印才准确,能输出所有读到的字节。 - 文件描述符搞混:比如把源文件和目标文件的fd弄反,写操作写到源文件里,或者读操作读的是空的目标文件,自然读不到内容。
- 忘记关闭文件描述符:虽然这一般不会直接导致读不到内容,但会造成资源泄漏,甚至后续操作出问题,养成读完写完就
close(fd)的习惯。
给你贴一段正确的示例代码,你可以对照着找自己的问题:
#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #define BUF_SIZE 1024 int main(int argc, char *argv[]) { int src_fd, dest_fd; ssize_t nread; char buf[BUF_SIZE]; // 检查输入参数 if (argc != 3) { fprintf(stderr, "用法: %s <源文件路径> <目标文件路径>\n", argv[0]); exit(EXIT_FAILURE); } // 打开源文件(只读模式) src_fd = open(argv[1], O_RDONLY); if (src_fd == -1) { perror("打开源文件失败"); exit(EXIT_FAILURE); } // 打开目标文件(写+创建+截断现有内容,权限设为0644) dest_fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644); if (dest_fd == -1) { perror("打开目标文件失败"); close(src_fd); // 出错也要关闭已打开的文件 exit(EXIT_FAILURE); } // 循环读取源文件并写入目标文件 while ((nread = read(src_fd, buf, BUF_SIZE)) > 0) { ssize_t nwritten = write(dest_fd, buf, nread); if (nwritten != nread) { perror("写入目标文件失败"); close(src_fd); close(dest_fd); exit(EXIT_FAILURE); } // 打印缓冲区内容(用write避免二进制内容的打印问题) write(STDOUT_FILENO, buf, nread); } // 检查读取过程是否出错 if (nread == -1) { perror("读取源文件失败"); close(src_fd); close(dest_fd); exit(EXIT_FAILURE); } // 关闭文件描述符 if (close(src_fd) == -1 || close(dest_fd) == -1) { perror("关闭文件失败"); exit(EXIT_FAILURE); } return EXIT_SUCCESS; }
要是对照完还是找不到问题,把你的代码贴出来,我帮你具体分析~
内容的提问来源于stack exchange,提问作者Nicolas Granados
相关产品推荐
相关产品推荐

