如何关闭在外部函数中打开的文件

问题描述 投票:0回答:1

我正在使用预编译的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();
}

这里,closed总是等于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

c stdio resource-leak
1个回答
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);

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

© www.soinside.com 2019 - 2024. All rights reserved.