在exit()上关闭打开的目录

时间:2014-02-13 20:54:14

标签: c linux dir

我想知道是否有办法从当前进程访问所有打开目录的列表?我有一个递归打开许多目录的函数,但一旦出错就退出程序。当然,我想在调用exit()之前关闭所有目​​录,而不必跟踪我打开的所有内容。这甚至可能吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

  

我有一个递归打开许多目录的函数,但是一旦出错就退出程序。   当然,我想在调用exit()之前关闭所有目​​录,而不必跟踪我打开的所有内容。

我认为你的做法是错误的。如果不对它们进行处理,打开目录有什么意义呢?

只要您需要,您应该保留对已打开目录的引用,并尽快将其丢弃。

请记住,通常情况下,打开文件描述符的名称是有限的,例如。 G。到1024。

答案 1 :(得分:0)

您不需要这样做,因为exit()将(最终)退出进程,这将关闭所有打开的文件描述符,无论是目录还是真实文件。

但是,您绝对需要担心valgrind和朋友报告这一点,因为这意味着fd正在您的程序中泄露。但解决方案不是寻找开放目录,而只是确保每个opendirclosedir匹配。这就是valgrind促使你做的事情。

答案 2 :(得分:0)

当您exit()时,文件句柄为close()d。这对于一次性工具很有用,但从长远来看这不是好的做法。

你应该在你去的时候走回递归,close()ing。替换,例如:

exit(1);

有:

close(current_fd);
return NULL;

更改您的递归调用:

if (thisfunc(...) == NULL) {
    close(current_fd);
    return NULL;
}