参阅 CPAN 里的 Time::HiRes 模块获取一个有着更好的分辨率的时间装置的更严格的方法。
sysopen FILEHANDLE, FILENAME, MODE, MASK
sysopen FILEHANDLE, FILENAME, MODE
sysopen 函数打开 FILENAME 给出文件名的文件,并且把它和 FILEHANDLE 关联起来。如果FILEHANDLE 是一个表达式,那么它的值用做该文件句柄的名字或者引用。如果 FILEHANDLE是一个未定义值的变量,那么 Perl 将会为你创建一个值。如果调用成功,那么返回值是真,否则是假。
这个函数是你的系统 open(2) 系统调用后面跟着一个 fdopen(2) 库调用的接口。因此,在这儿你需要略微把自己想象成一个 C 程序员。MODE 参数的可能数值和标志位可以通过 Fcntl 模块获得。因为不同的系统支持不同的标志位,所以不要指望你的系统里能够用上所有这些标志位。参阅你的 open(2) 手册页或者它本地的等价物获取细节。当然,下面的标志在那些带有合理 C 库的系统里是存在的:
不过,还有许多其他选项。下面是一些不那么常见的标志:
O_EXCL 标志不是用于锁定的:在这里,排它意味着如果该文件已经存在,那么 sysopen 失败。
如果 FILENAME 命名的文件还不存在,并且 MODE 包括 O_CREAT 标志,那么 sysopen 将在被你的当前 umask 修改后的参数 MASK 决定的权限范围内(或者如果省略这个参数时缺省是 0666)创建该文件。这样的缺省是有道理的,参阅 unmask 里的记录获得一个解释。
用 open 和 sysopen 打开的文件句柄可以交互地使用。你不必因为碰巧用 sysopen 打开了文件而使用 sysread 和它的朋友们来操作文件,而如果你用 open 打开它也不意味着你就不能用 sysread 等函数。open 和 sysopen 都可以做一些对方做不了的事情。普通的 open 可以打开管道,派生进程,设置纪律,复制文件句柄,以及把一个文件描述符号码转换成一个文件句柄。它还忽略文件名开头和结尾的空白,并且把“-”当作一个特殊的文件名。但是如果你要打开的是一个真正的文件,那么 sysopen 就可以做 open 能做的任何事情。
下面的例子显示了对两个函数的等效调用。我们为了清晰起见省略了 or die $! 检查,不过你自己的程序里可是一定要检查这些值的呦。我们将把我们限制于只检查那些实际上在所有操作系统里都可以用的标志。这个活只是用位操作符 | 把传递给 MODE 参数的数值 OR (或)在一起而已。
打开文件读取:
open(FH, "<", $path);
sysopen(FH, $path, O_RDONLY);
打开文件写,如果必要,创建该文件,或者把原来的文件截除:
open(FH, ">", $path);
sysopen(FH, $path, O_WRONLY| O_TRUNC | OCREAT);
打开一个文件用于附加,必要时创建一个:
open(FH, ">>", $path);
sysopen(FH, $path, O_RDWR);
打开一个文件用于更新,该文件必须已经存在:
open(FH, "+<", $path);
sysopen(FH, $path, O_RDWR);
而下面的事情是你可以用 sysopen 干的,但是却不能用普通的 open 干:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-28372-18.html
在不经我大中国同意的情况下派军舰前来