gpt4 book ai didi

perl - 在 Perl 中不关闭目录句柄有什么含义?

转载 作者:行者123 更新时间:2023-12-04 13:03:51 25 4
gpt4 key购买 nike

我最近继承了别人写的一些代码。

我发现在代码中所有打开目录以供阅读的地方都没有关闭它,因为最初的开发人员有一个语法问题——他使用的是 close尝试关闭目录句柄而不是 closedir 的函数功能。

代码是这样的:

opendir( DIR, $dir ) or die "Cannot open $dir: $!\n";
@files = readdir( DIR );
close( DIR );

(这是 Perl 最佳实践(第 208,278 页)中关于检查 close 函数的返回的另一个优点。如果在这种情况下检查 close 的返回,它将失败并显示“错误的文件号” ”。)

我已经将其更改为 closedir ,但这让我开始怀疑:既然目录句柄从未关闭,那么长时间保持目录句柄打开有什么负面影响?

这个程序比较大(3500行代码),运行了一段时间(5-10分钟),这个程序的多个实例同时运行。对于上例中的此目录, $dir对于所有实例都是相同的值。如果该程序的 10 个实例同时运行,则它们都针对同一目录持有一个打开的目录句柄达 5 分钟或更长时间。我确信 Perl 会在程序完成时自动关闭目录句柄,但最佳实践是尽快关闭它。

对我来说,让文件句柄保持打开状态会导致问题的情况更为明显(尤其是对于为写入而打开的文件句柄),但是不关闭目录句柄会发生什么坏事?

我问的原因是因为有一个奇怪的情况,这个程序试图创建一个文件(在上面由 $dir 定义的目录中)。文件名中嵌入了 PID,因此文件已经存在的可能性较小,但是 Perl 无法打开文件进行写入,因为它说它已经存在。当我们查看目录时,该文件不存在。我想知道这个目录上的所有打开目录句柄是否会导致这样的问题?

我不确定操作系统是否有所作为,但该程序在 AIX 上运行。

提前致谢,周五快乐!

最佳答案

你浪费了一个目录描述符——它可能算作一个文件描述符。如果您的程序打开了足够多的目录以耗尽文件描述符,最终会伤害您。否则,它是非常无害的,虽然不太理想。它使系统(和 Perl)保持资源,否则它可能能够释放。

如果目录句柄是一个局部变量,而不是一个普通的 DIR 样式名称,那么您可能需要 Perl 清理。见 opendir其中说:

Opens a directory named EXPR for processing by readdir, telldir, seekdir, rewinddir, and closedir. Returns true if successful. DIRHANDLE may be an expression whose value can be used as an indirect dirhandle, usually the real dirhandle name. If DIRHANDLE is an undefined scalar variable (or array or hash element), the variable is assigned a reference to a new anonymous dirhandle. DIRHANDLEs have their own namespace separate from FILEHANDLEs.

关于perl - 在 Perl 中不关闭目录句柄有什么含义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3687198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com