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

调用系统调用read引发无限循环,求wc -c替代控制台应用解决方案

解决wc -c替代程序中read系统调用无限循环的问题

嘿,我来帮你搞定这个read无限循环的坑!首先咱们得揪出问题根源——用系统调用read的时候,你肯定没正确处理它的返回值对吧?这是新手用底层系统调用时最容易踩的坑之一。

为什么会无限循环?

read的返回值有三种关键情况,你必须逐一处理:

  • 返回值大于0:这是实际读到的字节数,正常累加计数就行
  • 返回值等于0:说明已经读到文件末尾(EOF),这时候必须终止循环
  • 返回值小于0:代表出现错误,但要区分是可重试的错误(比如信号中断的EINTR)还是致命错误(比如无效文件描述符EBADF)

如果你的代码里只累加了读到的字节数,没判断返回值为0的情况,那当文件读完后,read会一直返回0,你就会陷入无限循环,一直把0加到计数里,永远停不下来。

给你修正后的核心代码示例

假设你用C语言开发,针对单个文件的读取逻辑应该改成这样:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

long long count_file_bytes(int fd) {
    char buf[4096]; // 用4KB缓冲区,效率更高
    ssize_t bytes_read;
    long long total = 0;

    while ((bytes_read = read(fd, buf, sizeof(buf))) > 0) {
        total += bytes_read;
    }

    // 处理读取错误
    if (bytes_read < 0) {
        perror("read failed");
        return -1;
    }

    return total;
}

然后处理多个文件的逻辑里,每个文件要单独打开、读取、关闭:

for (int i = 1; i < argc; i++) {
    int fd = open(argv[i], O_RDONLY);
    if (fd == -1) {
        perror(argv[i]);
        continue;
    }

    long long bytes = count_file_bytes(fd);
    if (bytes != -1) {
        printf("%lld %s\n", bytes, argv[i]);
    }

    close(fd);
}

额外要注意的细节

  • 每次处理新文件前,一定要重置计数变量,别把上一个文件的字节数累加到下一个文件里
  • 打开文件后必须检查是否成功(fd != -1),不然会导致后续read出错
  • 如果遇到EINTR错误(read被信号中断),可以重试一次read,避免误判为EOF

这样改完后,你的程序就不会再出现无限循环的问题了,能正确统计每个文件的字节数啦!

内容的提问来源于stack exchange,提问作者kuskmen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:24:41