温馨提示×

debian readdir错误码怎么看

小樊
38
2026-10-16 01:55:24
栏目: 智能运维

在 Debian(以及其它 Linux 系统)里,readdir() 相关函数出错时,错误码是通过全局变量 errno 来查看的,而不是返回值本身。

下面分几种常见情况说明。


1. readdir / readdir_r 的返回值和 errno

readdir()

#include <dirent.h>

struct dirent *readdir(DIR *dirp);
  • 返回值
    • 成功:返回 struct dirent *
    • 失败:返回 NULL
  • 注意
    • 返回 NULL 不一定表示错误
    • 到达目录结尾也是返回 NULL,此时 errno 不变(通常为 0)

所以判断方式应该是:

errno = 0;
struct dirent *entry = readdir(dirp);
if (entry == NULL) {
    if (errno != 0) {
        perror("readdir");
    } else {
        // 正常结束
    }
}

常见 errno 值(readdir 可能遇到)

errno 含义
EBADF 目录流无效(DIR* 已关闭或非法)
ENOENT 目录在遍历过程中被删除
EIO I/O 错误(磁盘/文件系统问题)
ENOMEM 内存不足
EINVAL 参数非法(如 NULL 指针)

2. 如何“看”错误码

方法一:perror()(最常用)

perror("readdir");

输出示例:

readdir: No such file or directory

方法二:strerror(errno)

#include <string.h>
#include <errno.h>

printf("error: %s\n", strerror(errno));

方法三:直接打印数值(调试用)

printf("errno = %d\n", errno);

3. 查看 errno 含义(Debian 本地)

查 man 手册

man errno
man readdir

查头文件

grep EBADF /usr/include/asm-generic/errno*.h

4. readdir_r(已不推荐,但仍在用)

int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
  • 返回值直接是错误码
  • 成功返回 0
  • 失败返回 errno 值
int ret = readdir_r(dirp, &ent, &res);
if (ret != 0) {
    fprintf(stderr, "readdir_r error: %s\n", strerror(ret));
}

5. 常见坑提醒

❌ 错误写法:

if (!readdir(dirp)) {
    perror("readdir");  // 可能误报
}

✅ 正确写法:

errno = 0;
if (!readdir(dirp) && errno) {
    perror("readdir");
}

如果你愿意,可以贴一段 具体的 C 代码或报错信息,我可以帮你精确定位是哪个 errno、为什么出现。

0 踩