温馨提示×

centos readdir失败咋解决

小樊
36
2026-10-14 22:24:48
栏目: 智能运维

在 CentOS 上 readdir 失败,通常不是代码本身的问题,而是环境/权限/文件系统相关。下面按最常见原因 → 排查方法 → 解决办法给你一套思路。


一、先看 errno(最关键)

readdir 失败一定要看 errno,不要只看返回值。

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

perror("readdir");
// 或
printf("errno=%d: %s\n", errno, strerror(errno));

常见 errno 含义:

errno 含义 说明
EACCES 权限不足 目录没权限
EBADF 文件描述符无效 opendir 没成功
ENOENT 目录不存在 路径错了
ENOTDIR 不是目录 当成目录打开
EMFILE / ENFILE 文件描述符耗尽 没关 dir
EIO 磁盘/文件系统错误 硬盘或网络存储问题

二、最常见原因及解决办法

1️⃣ 目录权限不足(最常见)

ls -ld /path/to/dir

解决:

chmod +rx /path/to/dir

或切换用户:

sudo -u correct_user your_program

⚠️ 注意:父目录也要有 x 权限


2️⃣ opendir 没成功就 readdir

错误示例:

DIR *dir = opendir("/some/path");
// 没判断 dir == NULL
readdir(dir); // 必崩或失败

正确写法:

DIR *dir = opendir(path);
if (!dir) {
    perror("opendir");
    return;
}

3️⃣ 路径不存在或写错

ls /path/to/dir

如果是符号链接:

ls -l /path/to/dir

解决:

  • 修正路径
  • 或先 stat() 判断

4️⃣ 网络文件系统问题(NFS / CIFS)

CentOS 常见:

  • NFS 超时
  • 挂载断开

检查:

mount | grep nfs
df -h
dmesg | tail

解决:

mount -o remount /mnt/nfs

或加 soft,intr 挂载选项。


5️⃣ SELinux 限制(CentOS 特有)

SELinux 会悄悄拒绝访问。

检查:

getenforce

临时验证:

setenforce 0

如果好了,说明是 SELinux:

ausearch -m avc -ts recent

解决:

semanage fcontext -a -t httpd_sys_content_t "/path/to/dir(/.*)?"
restorecon -Rv /path/to/dir

6️⃣ 文件描述符耗尽

ulimit -n
lsof | wc -l

解决:

  • 关闭未用的 DIR*
  • 修改 limits

7️⃣ 磁盘错误或只读

df -h
mount | grep "ro,"
dmesg | grep error

解决:

fsck /dev/sdX
mount -o remount,rw /

三、最小可运行示例(自查用)

#include <dirent.h>
#include <stdio.h>

int main() {
    DIR *dir = opendir("/tmp");
    if (!dir) {
        perror("opendir");
        return 1;
    }
    struct dirent *entry;
    while ((entry = readdir(dir))) {
        printf("%s\n", entry->d_name);
    }
    if (errno) perror("readdir");
    closedir(dir);
    return 0;
}

四、如果你愿意,我可以更精准帮你

你可以贴出:

  1. 完整错误(perror 输出)
  2. CentOS 版本
  3. 是本地目录还是 NFS
  4. C / C++ / Python / shell?

我可以直接告诉你具体是哪一条原因 + 命令级解决办法。

0 踩