PHP 直接I/O fcntl()函数
dio_fcntl()函数可以在fd描述符上执行c库的fcntl函数。
语法
mixed dio_fcntl( resource fd, int cmd [, mixed args] )
dio_fcntl()函数可以用”cmd”参数在文件描述符fd上执行指定的操作,某些命令需要额外的”args”参数。
当cmd设置为F_SETLK或F_SETLLW时,args可以是一个关联数组,包含以下键:”start”是锁开始的位置,”length”是锁定区域的大小,0表示文件结束,”wenth”是指向l_start的位置,可以是SEEK_SET,SEEK_END和SEEK_CUR,”type”是锁的类型:可以是F_RDLCK(读锁),F_WRLCK(写锁)或F_UNLCK(解锁)。
cmd可以是以下操作之一−
-
F_SETLK −设置或清除锁定。如果锁被其他进程持有,dio_fcntl()函数可能会返回-1。
-
F_SETLKW −与F_SETLK类似,但在锁被其他进程持有时,dio_fcntl()函数可能会等待锁释放。
-
F_GETLK −如果有其他进程阻止锁定,dio_fcntl()函数可以返回一个关联数组。如果没有障碍,”type”键可以由F_UNLCK设置。
-
F_DUPFD −找到大于或等于arg的最小编号的文件描述符,并返回它。
示例
<?php
fd = dio_open("/dev/ttyS0", O_RDWR);
if(dio_fcntl(fd, F_SETLK, Array("type" => F_WRLCK)) == -1) {
echo "The lock can not be cleared. It is held by someone else";
} else {
echo "Lock succesfully set/cleared";
}
dio_close($fd);
?>