在 Ubuntu(Linux)下,opendir 打开的目录句柄需要通过 closedir 来关闭,这是标准 POSIX 接口,不是 Ubuntu 特有的。
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir("/tmp");
if (dir == NULL) {
perror("opendir");
return 1;
}
// 使用 dir ...
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
// 关闭目录句柄(必须)
closedir(dir);
return 0;
}
opendir 返回的是 DIR *DIR *int)closedir 关闭int closedir(DIR *dirp);
0-1,并设置 errno❌ 错误示例(不会关闭目录句柄):
close(dir); // 错误!dir 不是 fd
Too many open files
#include <dirent.h>
DIR *dir = opendir(".");
// ...
closedir(dir);
#include <filesystem>
for (auto &p : std::filesystem::directory_iterator(".")) {
// 自动管理资源
}
import os
with os.scandir("/tmp") as it:
for entry in it:
print(entry.name)
目录句柄由系统自动管理,无需手动关闭。
ls -l /proc/<pid>/fd
如果看到大量 anon_inode 或目录相关 fd,可能没关闭。
如果你能说明:
我可以给你更针对性的建议。