我是靠谱客的博主 懦弱羽毛,最近开发中收集的这篇文章主要介绍linux中的lock文件,linux – 为什么即使文件被锁定,File :: FcntlLock的l_type总是“F_UNLCK”?...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

下面的Perl子例程使用File :: FcntlLock来检查文件是否被锁定.

为什么它返回0并且打印/tmp/test.pid被解锁.即使文件被锁定了?

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, '+

print "Could not open $filenamen";

return -1;

}

if (!$fs->lock($fd, F_GETLK)) {

print "Could not get lock information on $filename, error: $fs->errorn";

close($fd);

return -1;

}

close($fd);

if ($fs->l_type() == F_UNLCK) {

print "$filename is unlocked.n";

return 0;

}

return $fs->l_pid();

}

该文件被锁定如下(lock.sh):

#!/bin/sh

(

flock -n 200

while true; do sleep 1; done

) 200>/tmp/test.pid

该文件确实已锁定:

~$./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

解决方法:

fcntl和flock锁彼此不可见.

这对您的用例来说是个大问题,因为您在shell脚本中使用的flock实用程序依赖于flock语义:shell脚本运行flock子进程,该进程锁定继承的文件描述符然后退出. shell保持该文件描述符打开(因为重定向是在整个命令序列上),直到它想要释放锁.

该计划无法与fcntl一起使用,因为进程之间不共享fcntl锁.如果有一个与flock相同但使用fcntl的实用程序,则锁定将过早释放(一旦子进程退出).

为了协调perl进程和shell脚本之间的文件锁定,您可以考虑的一些选项是:

>将shell脚本移植到zsh并使用zsh / system模块内置的zsystem flock(注意:在声称使用fcntl的文档中,尽管它名称为flock)

>在perl中重写shell脚本

>只需在perl脚本中使用flock(放弃字节范围锁定和“get locker PID”功能 – 但你可以通过读取/ proc / locks在Linux上模拟它)

>在C语言中编写自己的fcntl实用程序以便在shell脚本中使用(使用模式将不同 – shell脚本必须对其进行后台处理,然后在以后将其解除以解锁 – 并且需要一些方法来告诉父进程何时它已经获得或未能获得锁定,这将很难,因为它现在异步发生…可能使用某些shell具有的协同处理功能).

>从shell脚本运行一个小的perl脚本来进行锁定(需要与专用fcntl实用程序需要的相同的后台处理)

标签:linux,perl,flock,fcntl

来源: https://codeday.me/bug/20190527/1164649.html

最后

以上就是懦弱羽毛为你收集整理的linux中的lock文件,linux – 为什么即使文件被锁定,File :: FcntlLock的l_type总是“F_UNLCK”?...的全部内容,希望文章能够帮你解决linux中的lock文件,linux – 为什么即使文件被锁定,File :: FcntlLock的l_type总是“F_UNLCK”?...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部