Niedawno odziedziczyłem kod, który napisał ktoś inny.Jakie są konsekwencje nie zamykania uchwyt katalogu w Perlu?
odkryłem, że wszędzie w kodzie, że katalog został otwarty do czytania, to nigdy nie został zamknięty, ponieważ oryginalny deweloper miał problem składni - był przy użyciu funkcji close
próbować zamknąć katalog obsłużyć zamiast funkcji closedir
.
Kod było coś takiego:
opendir(DIR, $dir) or die "Cannot open $dir: $!\n";
@files = readdir(DIR);
close(DIR);
(co jest kolejnym dobrym punktem, który jest wykonany w Perl Best Practices (strony 208,278) o sprawdzenie powrotu funkcji close
Jeśli powrót close
były. sprawdzone w tym przypadku, byłby to błąd z "Bad file number".)
Od tego czasu zmieniłem to na closedir
, ale zacząłem się zastanawiać: Ponieważ uchwyt katalogu nigdy nie był zamknięty, jakie są negatywne konsekwencje utrzymywać otwarty uchwyt katalogu na długi czas?
Ten program jest większy (3500 linii kodu), działa przez pewien czas (5-10 minut), a wiele wystąpień tego programu działa w tym samym czasie. W przypadku tego katalogu w powyższym przykładzie $dir
ma taką samą wartość dla wszystkich wystąpień. Jeśli 10 wystąpień tego programu było uruchomionych w tym samym czasie, wszystkie miały otwarty uchwyt katalogu do tego samego katalogu przez 5 minut lub dłużej. Jestem pewien, że Perl automatycznie zamyka uchwyt katalogu po zakończeniu programu, ale najlepsza praktyka mówi, aby zamknąć to tak szybko, jak to możliwe.
Jest dla mnie bardziej oczywiste, że pozostawienie otwartych uchwytów plików może powodować problemy (zwłaszcza w przypadku otwartych do pisania uchwytów plików), ale co może się stać złego, nie zamykając uchwytu katalogu?
Powodem, dla którego pytam, jest fakt, że w czasie, gdy program próbował utworzyć plik (w katalogu zdefiniowanym przez $ dir powyżej) wystąpiła dziwna okoliczność. Nazwa pliku zawierała PID, więc jest mniejsza szansa, że plik już istnieje, ale Perl nie mógł otworzyć pliku do zapisu, ponieważ powiedział, że już istniał. Kiedy zajrzeliśmy do katalogu, ten plik nie istniał. Zastanawiam się, czy wszystkie otwarte katalogi obsługuje ten katalog może spowodować taki problem?
Nie jestem pewien, czy system operacyjny robi różnicę, ale ten program działa w systemie AIX.
Z góry dziękuję i szczęśliwy piątek!
Nawet dziś niektóre systemy operacyjne są dość skąpe z deskryptorami plików (patrzę na * ciebie *, solaris i domyślne ustawienie 64-256). – mob
@mobrule - Przykro mi, nie mogę opublikować Twojego komentarza, ponieważ nie ma dostępnych deskryptorów plików - Z poważaniem, StackOverflow Solaris Backend .... – DVK