我正在使用预编译的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
您可以尝试手动关闭这些文件描述符:
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);
请注意,此方法不是线程安全的,因为它可能会关闭其他线程打开的文件描述符。