记录linux下文件锁被子进程继承造成的死锁问题

文件锁

文件锁flock特性

Linux文件锁一般是用来进程间的资源互斥,不是线程级别的,比如说单实例进程,防止脚本重复执行等。
文件锁在父子进程之间会被继承,也就是说父进程如果占用了文件锁,那么通过fork创建的子进程以及子进程的子进程等等也都占用了文件锁,可以认为同一个根节点祖宗进程的所有进程,都占用了这个文件锁。
文件锁在父子进程之间的占用释放特点,如果在子进程中调用了释放锁,那么父进程也会失去这把文件锁的占用。也就是说父子进程在锁的占用和释放上是共鸣的。
进程退出,当前进程的文件锁会被释放,但是有子进程的时候,子进程还是持有的。

这种特性可能会造成的问题

当父进程proc1派生子进程proc2,proc1用文件锁实现单实例进程,当proc1异常退出的时候,没有释放锁,proc2还在,proc2可能通过执行shell 命令派生了其它的进程,或者执行了耗时的命令,然后重新启动proc1的时候,就没办法获取到锁了,除非所有的子进程都退出,新启动的proc1相当于一个全新的进程。

解决办法

int fd = open("/tmp/tmp.txt",O_RDWR | O_CREAT, 0666);//| 一定要有O_CLOEXEC

open文件的时候指定O_CLOEXEC。或者fcntl 设置FD_CLOEXEC。
指定了这个属性之后,派生子进程的时候不会继承这个文件描述符,也就不会继承文件锁。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值