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

能否通过少于3次系统调用检测文件描述符fd的当前位置是否为文件末尾?

判断文件描述符是否处于文件末尾:少于3次系统调用的实现

当然有办法只用到2次系统调用完成判断,比常规的3次调用更高效:

  • 第一步:调用fstat(fd, &stat_buf),通过struct stat结构体的st_size字段直接获取文件总大小(第1次系统调用)。
  • 第二步:调用off_t curr_pos = lseek(fd, 0, SEEK_CUR),获取当前文件指针的位置(第2次系统调用)。
  • 最后直接比较curr_pos和stat_buf.st_size,相等即说明当前位置处于文件末尾。

注意事项

  • 该方法仅适用于普通文件(如磁盘文件),对于管道、套接字、字符设备这类无法执行lseek的文件描述符,lseek会返回-1并设置errno,需单独处理。
  • 若需兼容非普通文件,可能需结合read调用尝试读取数据来判断,但会引入额外复杂度。

示例代码片段

#include <sys/stat.h>
#include <unistd.h>

int is_at_eof(int fd) {
    struct stat stat_buf;
    if (fstat(fd, &stat_buf) == -1) {
        return -1; // 调用失败,返回错误标识
    }
    if (!S_ISREG(stat_buf.st_mode)) {
        // 非普通文件,无法使用该方法,可按需处理
        return -1;
    }
    off_t curr_pos = lseek(fd, 0, SEEK_CUR);
    if (curr_pos == -1) {
        return -1;
    }
    return (curr_pos == stat_buf.st_size) ? 1 : 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:20:43