文件锁
文件锁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。
指定了这个属性之后,派生子进程的时候不会继承这个文件描述符,也就不会继承文件锁。