Как закрыть файлы, которые открываются во внешней функции - PullRequest
0 голосов
/ 29 апреля 2019

Я использую предварительно скомпилированную функцию библиотеки 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

1 Ответ

0 голосов
/ 29 апреля 2019

Вы можете попробовать вручную закрыть эти файловые дескрипторы:

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);

Обратите внимание, что этот метод не является потокобезопасным, поскольку он может закрывать файловые дескрипторы, открытые другими потоками.

...