温馨提示×

如何关闭ubuntu copendir句柄

小樊
41
2026-09-02 14:42:07
栏目: 智能运维

在 Ubuntu(Linux)下,opendir 打开的目录句柄需要通过 closedir 来关闭,这是标准 POSIX 接口,不是 Ubuntu 特有的。


一、基本用法(C 语言)

#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;
}

二、关键点说明

1. opendir 返回的是 DIR *

  • 类型:DIR *
  • 不是普通文件描述符(不是 int

2. 必须用 closedir 关闭

int closedir(DIR *dirp);
  • 成功返回 0
  • 失败返回 -1,并设置 errno

❌ 错误示例(不会关闭目录句柄):

close(dir);        // 错误!dir 不是 fd

三、忘记关闭会怎样?

  • 会导致 文件描述符泄漏
  • 长时间运行的程序(守护进程、服务)可能最终报错:
    Too many open files
    

四、在 C++ 中(推荐RAII)

C++17 之前(手动)

#include <dirent.h>

DIR *dir = opendir(".");
// ...
closedir(dir);

C++17 之后(推荐)

#include <filesystem>

for (auto &p : std::filesystem::directory_iterator(".")) {
    // 自动管理资源
}

五、如果你是用其他语言

Python

import os
with os.scandir("/tmp") as it:
    for entry in it:
        print(entry.name)

Shell

目录句柄由系统自动管理,无需手动关闭。


六、调试:查看未关闭的目录句柄

ls -l /proc/<pid>/fd

如果看到大量 anon_inode 或目录相关 fd,可能没关闭。


如果你能说明:

  • 用的是 C / C++ / Python / Shell
  • 是否是 长时间运行程序
  • 是否遇到具体报错

我可以给你更针对性的建议。

0