2014-02-13 4 views
1

Хотелось бы узнать, есть ли способ получить доступ к списку всех открытых каталогов из текущего процесса? У меня есть функция, которая рекурсивно открывает много каталогов, но выходит из программы, как только что-то не так. Конечно, я хотел бы закрыть все каталоги перед вызовом exit() без необходимости отслеживать все, что я открываю. Возможно ли это?Закрытие открытых каталогов при выходе()

Спасибо!

+1

'выход()' закроются каждый дескриптор файла неявно. Вам нужно явно закрыть их? –

+0

, так что мне не все равно, о утечке сообщения valgrind об этом? – stzzz1

+0

Рассмотрите возможность использования [nftw (3)] (http://man7.org/linux/man-pages/man3/nftw.3.html) –

ответ

1

У меня есть функция, которая рекурсивно открывает многие каталоги, но выходит из программы, как только что-то не так. Конечно, я хотел бы закрыть все каталоги перед вызовом exit(), не отследя все, что я открываю.

Я думаю, что ваш подход очень неправильный. Какой смысл открывать каталоги, если вы не держите их в руках?

Вы должны хранить ссылку на открытую директорию, если она вам нужна, и отменить ее, как только сможете.

Имейте в виду, что обычно число дескрипторов открытых файлов ограничено, e. г. до 1024.

0

Вам не нужно это делать, так как exit() (в конце концов) выйдет из процесса, который закроет все открытые дескрипторы файлов, будь то для каталогов или реальных файлов.

Однако, вы абсолютно сделать нужно беспокоиться о valgrind и друзей Сообщая об этом, так как это означает, что fd s протекают в вашей программе. Но решение состоит не в том, чтобы охотиться вокруг открытых каталогов, а просто для обеспечения того, чтобы каждый opendir соответствовал closedir. Это то, что вам предлагает valgrind.

0

Когда вы exit(), файловые дескрипторы - close()d. Это полезно для одноразовых инструментов, но не для хорошей практики в долгосрочной перспективе.

Вы должны вместо этого вернуться к рекурсии, close()ing, как вы идете. Заменить, например:

exit(1); 

для:

close(current_fd); 
return NULL; 

Изменить рекурсивный вызов для:

if (thisfunc(...) == NULL) { 
    close(current_fd); 
    return NULL; 
} 
Смежные вопросы