LINUX.ORG.RU

fopen, fclose, opendir, readdir, closedir. Помогите, плиз...


0

0

Ситуация такова, что программа сканирует винчестер, открывает все файлы (fopen), читает из них 1К инфо (fread), обрабатывает прочитанные данные и закрывает файл (fclose). Для поиска по дереву пользуюсь рекурсивной функцией, которая вызывает Dir = opendir(_Dir), readdir(Dir), closedir(Dir). Когда в директории больше нет файлов, ее закрываю, и перехожу на предыдущий уровень рекурсии. Проблема в том, что, когда в очередной раз вызываю opendir(_Dir), функция возвращает NULL, говорит "Too many open files" и больше не хочет открывать директории... Лог-файл говорит, что все ранее открытые директории и файлы программа закрыла. В чем может быть дело?

anonymous

Попробуй man 3 ftw.

anonymous
()
Ответ на: комментарий от ovsov

Каким образом я могу узнать посредством /proc какие файлы открыты?..

anonymous
()

ну в /proc там есть директории то бишь номера процессов. Вот и в директории для твоего процесса там есть еще один что-то типа fd (нет у меня Linuxa сейчас под рукой) ну и там будут дескрипторы ... много их должно быть в твоем случае. штук 256 как минимум ... Эти самые дескрипторы это symlinki и указывать он будет на что-то типа 0301:11999. Первый (0301) это номер device ... т.е. major+minor. А вот второй это i-node number. Ну а потом cd / ls -Ri | grep 11999. он все и расскажет ... какой это файл. И так повторить 256 раз для всех файлов. :-))) Ну я думаю, что пары будет достаточно ... Может там просто какие-то проблемы с crossing the mount-points или что-то в этом духе.

ovsov
()

Informaciu kotoryu ya tebe podsunul naschet proca ... skazhem tak uzhe slegka nesvezhaya :-))). Seichas vse eto eshe prosche. Seichas v kernelah nachinaya s 2.2 etot samii symlink ykazivaet na file a ne na major-minor:inode kak bilo ran'she. K sozhaleniu tebe ne pridetsya povtoryat' procedury poiska imeni faila 256 raz.

ovsov
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.