You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

系统调用实现文件复制程序故障求助:读取文件疑存问题

嘿,我懂你现在的挫败感——用系统调用做文件复制就算是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:58:16