能否通过少于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
相关产品推荐
相关产品推荐

