Sau*_*lva 4 linux perl flock fcntl
下面的Perl子例程File::FcntlLock用于检查文件是否被锁定.
即使文件被锁定,为什么还要返回0并打印/tmp/test.pid is unlocked.?
sub getPidOwningLock {
my $filename = shift;
my $fs = new File::FcntlLock;
$fs->l_type( F_WRLCK );
$fs->l_whence( SEEK_SET );
$fs->l_start( 0 );
$fs->l_len( 0 );
my $fd;
if (!open($fd, '+<', $filename)) {
print "Could not open $filename\n";
return -1;
}
if (!$fs->lock($fd, F_GETLK)) {
print "Could not get lock information on $filename, error: $fs->error\n";
close($fd);
return -1;
}
close($fd);
if ($fs->l_type() == F_UNLCK) {
print "$filename is unlocked.\n";
return 0;
}
return $fs->l_pid();
}
Run Code Online (Sandbox Code Playgroud)
该文件被锁定如下(lock.sh):
#!/bin/sh
(
flock -n 200
while true; do sleep 1; done
) 200>/tmp/test.pid
Run Code Online (Sandbox Code Playgroud)
该文件确实已锁定:
~$ ./lock.sh &
[2] 16803
~$ lsof /tmp/test.pid
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 26002 admin 200w REG 8,5 0 584649 test.pid
sleep 26432 admin 200w REG 8,5 0 584649 test.pid
Run Code Online (Sandbox Code Playgroud)
小智 6
fcntl和flock锁彼此不可见.
这对您的用例来说是个大问题,因为flock您在shell脚本中使用的实用程序依赖于flock语义:shell脚本运行flock子进程,该进程锁定继承的文件描述符然后退出.shell保持该文件描述符打开(因为重定向是在整个命令序列上),直到它想要释放锁.
该计划无法使用,fcntl因为fcntl锁不在进程之间共享.如果有一个与flock使用相同的实用程序fcntl,则锁定将过早释放(一旦子进程退出).
为了协调perl进程和shell脚本之间的文件锁定,您可以考虑的一些选项是:
zsh并使用模块中的zsystem flock内置函数zsh/system(注意:在它声称使用的文档fcntl中尽管名称正在使用flock)/proc/locks)fcntl在C语言中编写自己的实用程序以便在shell脚本中使用(使用模式将不同 - shell脚本必须对其进行后台处理,然后在以后将其解除以解锁 - 并且它需要一些方法来告诉父进程何时有获得或未能获得锁定,这将是困难的,因为它现在异步发生......可能使用某些shell具有的协同处理功能).fcntl实用程序需要的相同的后台处理)有关不同类型锁的功能的更多信息,请参阅使用fcntl和锁定有什么区别flock.
| 归档时间: |
|
| 查看次数: |
245 次 |
| 最近记录: |