Я недавно унаследовал некоторый код, который написал кто-то другой.
Я обнаружил, что везде в коде, в котором каталог открывался для чтения, он никогда не закрывался, потому что у исходного разработчика была проблема с синтаксисом - он использовал функцию close
, чтобы попытаться закрыть дескриптор каталогафункции closedir
.
Код был примерно таким:
opendir( DIR, $dir ) or die "Cannot open $dir: $!\n";
@files = readdir( DIR );
close( DIR );
(что является еще одним хорошим замечанием в Perl Best Practices (стр. 208, 278) о проверке возврата).функции close
. Если в этом случае было проверено возвращение close
, то с ошибкой "Bad file number" произойдет сбой.)
С тех пор я изменил это значение на closedir
, ноэто заставило меня задуматься: так как дескриптор каталога никогда не был закрыт, каковы отрицательные последствия для того, чтобы держать дескриптор каталога открытым в течение длительного времени?
Эта программа больше (3500 строк кода), работает дляwhile (5-10 минут), и несколько экземпляров этой программы работают одновременно.В случае этого каталога в приведенном выше примере $dir
является одинаковым значением для всех экземпляров.Если 10 экземпляров этой программы выполнялись одновременно, все они держали дескриптор открытого каталога в одном и том же каталоге в течение 5 минут или дольше.Я уверен, что Perl автоматически закрывает дескриптор каталога, когда программа завершает свою работу, но в соответствии с рекомендациями закройте его как можно скорее.
Для меня более очевидно, что если оставить дескрипторы файлов открытыми, это может вызвать проблемы (особеннодля файловых дескрипторов, которые открыты для записи), но какие плохие вещи могут произойти, если не закрыть дескриптор каталога?
Причина, по которой я спрашиваю, состоит в том, что было странное обстоятельство, когда эта программа пыталась создатьфайл (в каталоге, определенном $ dir выше).В имя файла встроен PID, поэтому вероятность того, что файл уже может быть там, меньше, но Perl не смог открыть файл для записи, поскольку он сказал, что он уже существует.Когда мы посмотрели в каталоге, этот файл не существует.Мне интересно, могут ли все дескрипторы открытого каталога в этом каталоге вызывать такую проблему?
Я не уверен, что ОС имеет значение, но эта программа работает в AIX.
Заранее спасибо, и счастливой пятницы!