如何关闭在外部功能中打开的文件

时间:2019-04-29 12:08:38

标签: c stdio resource-leak

我正在使用预编译的C库函数(使用C ++编写自己的代码),该函数打开文件而不关闭文件。我通过查看 / proc / {PID} / fd中进程的文件描述符列表来确认这一点。 每次调用该函数时,都会创建一个指向相同文件的文件描述符。

我的问题是我必须对该函数进行大量的迭代,最终由于该函数而崩溃。

当然,我在文件流上没有指针,所以不能使用fclose。

我尝试使用fcloseall(),但它不会关闭任何打开的流。

下面是一些最小的代码:


#include "MatisseSDK.h"
#include <stdio.h>
const int MAX_ITERATIONS = 10000;
for(int i = 0; i < MAX_ITERATIONS ; i++){
   result = CallMatisse(...);
   int closed = fcloseall();
}

在这里,关闭状态始终等于0,文件描述符的数量从不减少。

是否存在另一种强制关闭这些文件流的方法,或者我需要完全停止该程序才能销毁它们?

这是文件描述符列表的示例:

total 0
lrwx------ 1 slendorm slendorm 64 29 avril 14:24 0 -> /dev/pts/17
lrwx------ 1 slendorm slendorm 64 29 avril 14:24 1 -> /dev/pts/17
lrwx------ 1 slendorm slendorm 64 29 avril 14:24 10 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/rs.idx
lrwx------ 1 slendorm slendorm 64 29 avril 14:25 11 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/rs.idx
lrwx------ 1 slendorm slendorm 64 29 avril 14:25 12 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/rs.idx
lrwx------ 1 slendorm slendorm 64 29 avril 14:25 13 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/rs.idx
lrwx------ 1 slendorm slendorm 64 29 avril 14:25 14 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/rs.idx
lrwx------ 1 slendorm slendorm 64 29 avril 14:27 15 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/rs.idx
lrwx------ 1 slendorm slendorm 64 29 avril 14:25 16 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/rs.idx
lrwx------ 1 slendorm slendorm 64 29 avril 14:27 17 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/rs.idx
lrwx------ 1 slendorm slendorm 64 29 avril 14:27 18 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/rs.idx
lrwx------ 1 slendorm slendorm 64 29 avril 14:27 19 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/CK1.idx
lrwx------ 1 slendorm slendorm 64 29 avril 14:24 2 -> /dev/pts/17
l-wx------ 1 slendorm slendorm 64 29 avril 14:24 3 -> /home/slendorm/Documents/ASPECT/UNITS/TABMATISSE/TEST/res/irradiance.out
lrwx------ 1 slendorm slendorm 64 29 avril 14:24 4 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/rs.idx
lrwx------ 1 slendorm slendorm 64 29 avril 14:24 5 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/rs.idx
lrwx------ 1 slendorm slendorm 64 29 avril 14:24 6 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/rs.idx
lrwx------ 1 slendorm slendorm 64 29 avril 14:24 7 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/rs.idx
lrwx------ 1 slendorm slendorm 64 29 avril 14:25 8 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/rs.idx
lrwx------ 1 slendorm slendorm 64 29 avril 14:24 9 -> /home/slendorm/Documents/ASPECT/MATISSE/BDD/ATMOS/1D/2/rs.idx

1 个答案:

答案 0 :(得分:0)

您可以尝试手动关闭这些文件描述符:

int fd, next_fd, next_fd2;
next_fd = dup(STDIN_FILENO);
close(next_fd);

// call that function which forgets to close its file descriptors

next_fd2 = dup(STDIN_FILENO);
close(next_fd2);
for(fd = next_fd; fd < next_fd2; ++fd)
    close(fd);

请注意,此方法不是线程安全的,因为它可能会关闭其他线程打开的文件描述符。