Arch/Manjaro下readdir()不返回.和..目录、NixOS正常问题求解
readdir()在Manjaro环境不返回
.和..目录的解决方案 POSIX标准明确规定readdir()必须返回.(当前目录)和..(上级目录)两个特殊目录项,你遇到的Manjaro环境下无返回的情况属于不符合标准的异常行为,可通过以下方案解决:
- 方案1:修正代码笔误后重测
你提供的测试代码中存在低级笔误,printf("%s/n");的换行符写反,正确应为printf("%s\n");,错误的换行符会导致所有输出内容挤在同一行,很容易让你误以为开头的.和..没有输出,建议先修正该问题后重新运行测试。 - 方案2:编译时显式指定标准兼容宏
Manjaro的gcc可能默认启用了非标准的功能裁剪,编译时添加POSIX标准兼容宏强制glibc遵循标准实现即可,编译示例:
gcc your_code.c -o output -D_POSIX_C_SOURCE=200809L -D_DEFAULT_SOURCE
- 方案3:检查目录所在分区的挂载选项
如果你遍历的目录位于vfat、ntfs等非Linux原生文件系统分区,部分发行版会默认添加hide_dot_files挂载参数自动隐藏.开头的文件/目录,你可以执行mount命令查看对应分区的挂载选项,如果存在该参数,重新挂载分区去掉该参数即可恢复显示。 - 方案4:手动补全特殊目录(兼容性最高)
所有正常存在的目录必然包含.和..两个目录项,你可以直接在遍历逻辑前手动输出这两项,完全规避不同发行版的实现差异,代码示例:
#include <stdio.h> #include <dirent.h> #include <string.h> int main() { DIR *dir = opendir('.'); struct dirent *dir_info; // 先手动输出两个特殊目录 printf(".\n"); printf("..\n"); while ((dir_info = readdir(dir))) { // 过滤系统可能返回的.和..避免重复输出 if (strcmp(dir_info->d_name, ".") == 0 || strcmp(dir_info->d_name, "..") == 0) { continue; } printf("%s\n", dir_info->d_name); } closedir(dir); return 0; }
内容的提问来源于stack exchange,提问作者LucasP.
相关产品推荐
相关产品推荐

