下面的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 $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();

}

该文件被锁定如下(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”?...相关推荐

  1. 解除linux中文件被锁状态,linux – 为什么即使文件被锁定,File :: FcntlLock的l_type总是“F_UNLCK”?...

    下面的Perl子例程使用File :: FcntlLock来检查文件是否被锁定. 为什么它返回0并且打印/tmp/test.pid被解锁.即使文件被锁定了? sub getPidOwningLock ...

  2. linux非标准头文件,Linux学习:unix的标准化的实现(Linux中各种限制-数据类型-各种标准化头文件介绍)...

    作为Linux的前身,unix标准化是十分重要的.我在这里挑几个重要的点说明. 1:Linux中各种限制.Linux中限制有编译时限制和运行时限制,另外有一些限制是由于我们的实现不同而不同,因此我们需 ...

  3. 如何在Linux中使用sFTP上传或下载文件与文件夹

    如何在Linux中使用sFTP上传或下载文件与文件夹 sFTP(安全文件传输程序)是一种安全的交互式文件传输程序,其工作方式与 FTP(文件传输协议)类似. 然而,sFTP 比 FTP 更安全;它通过 ...

  4. linux上传oracle压缩包,Linux中从oracle官网下载jdk文件不是标准的gzip格式文件问题...

    http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-lin ...

  5. linux使用grep查找文件内容,Linux中使用grep命令搜索文件名及文件内容的方法

    这篇文章主要介绍了Linux中使用grep命令搜索文件名及文件内容的方法,同时文中还介绍了将匹配结果高亮显示的方法,相当实用,需要的朋友可以参考下 从文件中搜索并显示文件名 当从多个文件中搜索时,默认 ...

  6. linux中用户组和用户,linux中用户和用户组

    一.用户和组原理 一个用户可以属于多个组,一个组有多个用户 在Linux中操作系统必须依赖组和用户进行管理 二.与用户和组相关的配置文件 1.组相关配置文件 1)/etc/group :管理用户组信息 ...

  7. linux中original_如何在 Linux 中整理磁盘碎片

    如何在 Linux 中整理磁盘碎片 转载自: 如何在 Linux 中整理磁盘碎片​linux.cn 有一个神话是 linux 的磁盘从来不需要整理碎片.在大多数情况下这是真的,大多数因为是使用的是优秀 ...

  8. 在linux中的sort命令,linux中sort命令

    功能说明:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序. 参 数: -b 忽略每行前面开始出的空格字符. -c 检查文件是否已经按照顺序排序. -d 排序时,处理英文字母.数 ...

  9. linux中线程的问题,linux中的线程问题

    linux中的线程问题 我程序的源代码: /* File sem.c */ #include #include #include #define MAXSTACK 100 int stack[MAXS ...

最新文章

  1. Objective-C property属性解析
  2. 运维工程师必备技能:网络排错
  3. 捋一捋PDF、PMF、CDF是什么
  4. 修改eclipse默认编码方式
  5. ARM Cortex-M3与Cortex-M4中断相关寄存器
  6. java成神之——Fork/Join基本使用
  7. 职场中怎么看待上级“发火”的问题?
  8. 三星手机GT-S7898连不上电脑,无法调试
  9. 安装Office InfoPath 2007
  10. python给乘风破浪的姐姐制作词云打call图
  11. CSS3-选择器+文字+边框+背景+颜色+渐变
  12. 网络流量分析 NetFlow是什么 详解 科普 ~互联网业务流量监测技术的应用和设计---perfect
  13. 基于EasyIPCamera实现的数字网络摄像机IPCamera的模拟器IPC RTSP Simulator
  14. MATLAB基本常识
  15. Meth | linux创建用户、密码、ssh登陆
  16. jconsole是否可以在生产环境使用_使用rmi jmx JCONSOLE远程监控JVM
  17. JavaScript之JS事件机制
  18. js获取手机设备型号,兼容h5
  19. FACTUM高速3D打印机
  20. 每一个软件开发人员绝对必须掌握的关于 Unicode 和字符集的最基础的知识

热门文章

  1. (转)OS X Mountain Lion 系统配置 Apache+Mysql+PHP 详细教程
  2. Linux 命令(86)—— head 命令
  3. 后端处理方式:特殊格式时间转换(2020-11-27T02:58:41.000000Z)
  4. Tesseract处理背景渐变的图片
  5. Android 关于fragment切换重新加载的解决分享给大家
  6. 在MyEclipse中如何查看Spring/Hibernate/Struts/JDK等源码的方法
  7. Clojure Web 开发 (一)
  8. 使用 Kotlin Script 自定义实现项目开发脚手架
  9. Hadoop完全分布式安装Kafka
  10. linux scp命令参数及用法详解--linux远程复制拷贝命令使用实例【转】