比较简单的方式有:
open FH, "filename";
open FH, "< filename";
open FH, "> filename";
open FH, ">>filename";
其中,第一种和第二种方式都是代表读文件,没有区别;第三种和第四种方式代表的是写文件,但区别是第三种是覆盖的方式而第四种是追加的方式。当打开一个文件句柄时记得close FH。
当对一个文件同时做多种读写操作时,会出现混乱。而Perl提供了一种可移植的锁定接口flock函数。
锁分为两种:共享锁(LOCK_SH标志)和排它锁(LOCK_EX标志)。共享锁多用于读文件,排它锁多用于写文件。但flock只是实现了劝告性的锁定,不阻止其它进程对文件的操作。只有所有用户都使用文件锁机制时,你才能安全访问一个文件。
flock缺省是阻塞的。
读文件例子:
use Fcntl wq(:DEFAULT :flock);
open (FH, "< filename") or die "can't open filename: $!";
flock(FH, LOCK_SH) or die "can't lock filename: $!";
#read from FH
|
如果是请求一个非阻塞锁:
flock(FH, LOCK_FH | LOCK_NB) or die "can't lock filename: $!";
|
锁都是针对文件句柄,不针对文件名。
如果在写文件时使用排它锁,需要使用sysopen打开文件,如:
use Fcntl qw(:DEFALUT :flock);
sysopen(FH, "filename", O_WRONLY | O_CREAT) or die "can't open filename:$!";
flock(FH, LOCK_EX) or die "can't lock filename:$!";
|
不能锁住一个没有打开的文件,也无法对多个文件使用一个锁。但可以用一个独立的文件充当信号灯,通过该文件中使用共享和排它锁来提供对其他文件的访问。
阅读(2891) | 评论(0) | 转发(0) |