在 Ubuntu(Linux)下,opendir() 打开的目录流必须显式释放,否则会造成文件描述符泄漏。
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir("/tmp");
if (dir == NULL) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir); // ✅ 释放目录流和内存
return 0;
}
| 函数 | 作用 |
|---|---|
opendir() |
打开目录,返回 DIR* |
readdir() |
读取目录项 |
closedir() |
释放资源(必须调用) |
只 free() 不 closedir() ❌
free(dir); // 错误!会导致 fd 泄漏
DIR* 不是普通 malloc 出来的内存,不能用 free()。
忘记 closedir() ❌
Too many open files重复 closedir() ❌
closedir(dir);
closedir(dir); // 可能导致崩溃或 undefined behavior
lsof -p <pid>
或
cat /proc/<pid>/fd
opendir()后一定要closedir(),不要free()。
如果你是在 C++ / 多线程 / 长时间运行服务 中遇到这个问题,也可以贴代码,我可以帮你检查是否有隐藏泄漏。