我最近继承了别人编写的一些代码。
我发现在代码中每次打开目录进行读取时,由于原始开发者存在语法问题 - 他使用了 close
函数来尝试关闭目录句柄,而不是 closedir
函数,因此从未关闭目录。
代码大致如下:
opendir( DIR, $dir ) or die "Cannot open $dir: $!\n";
@files = readdir( DIR );
close( DIR );
(这也是《Perl最佳实践》(第208、278页)中关于检查
close
函数返回值的另一个好处。如果在此情况下检查close
的返回值,它将失败并显示“坏文件号”)。)
我已经改为使用closedir
,但这让我开始思考:既然从未关闭目录句柄,保持目录句柄打开时间很长会有什么负面影响呢?
此程序较大(3,500行代码),运行一段时间(5-10分钟),同时运行多个该程序的实例。在上述示例中,如果有10个该程序的实例同时运行,则所有实例都会针对同一目录保持打开的目录句柄5分钟或更长时间。我相信当程序完成时,Perl会自动关闭目录句柄,但最佳实践是尽快关闭它。
对我来说,留下文件句柄不关闭可能会导致问题更加明显(特别是对于打开写入文件句柄的情况),但是不关闭目录句柄会发生什么不良后果呢?
我提出这个问题的原因是因为有一个奇怪的情况,即该程序试图创建一个文件(在$dir定义的目录中)。文件名中嵌入了PID,因此文件已经存在的可能性较小,但是Perl无法将该文件打开进行写操作,因为它说该文件已经存在。当我们查看目录时,该文件并不存在。我想知道这个目录上的所有打开目录句柄是否会导致这样的问题?
我不确定操作系统是否有影响,但该程序正在AIX上运行。
提前感谢您的帮助,并祝愉快的星期五!