相关疑难解决方法(0)

flock():删除没有竞争条件的锁定文件?

我正在将flock()用于进程间命名的互斥锁(即某些进程可以决定对"some_name"进行锁定,这是通过在temp目录中锁定名为"some_name"的文件来实现的:

lockfile = "/tmp/some_name.lock";
fd = open(lockfile, O_CREAT);
flock(fd, LOCK_EX);

do_something();

unlink(lockfile);
flock(fd, LOCK_UN);
Run Code Online (Sandbox Code Playgroud)

应该在某个时候删除锁定文件,以避免使用数百个文件填充临时目录.

但是,此代码中存在明显的竞争条件; 进程A,B和C的示例:

A opens file
A locks file
B opens file
A unlinks file
A unlocks file
B locks file (B holds a lock on the deleted file)
C opens file (a new file one is created)
C locks file (two processes hold the same named mutex !)
Run Code Online (Sandbox Code Playgroud)

有没有办法在某些时候删除锁定文件而不引入这种竞争条件?

c flock

21
推荐指数
2
解决办法
2万
查看次数

当进程意外死亡时,flock'ed文件会被解锁吗?

按照这个答案限制只运行一个php脚本的一个实例:

<?php

  $fp = fopen("/tmp/one.txt", "r+");
  if (flock($fp, LOCK_EX)) {
    //
    do_something_lengthy();
    //
    flock($fp, LOCK_UN);
  } else {
    echo "Couldn't get the lock!";
  }

  fclose($fp);

?>
Run Code Online (Sandbox Code Playgroud)

我的问题是,flock如果进程在中间do_something_lengthy(),即在调用之前死亡,那么'ed one.txt文件是否会被解锁flock($fp, LOCK_UN)

php centos

18
推荐指数
2
解决办法
7877
查看次数

标签 统计

c ×1

centos ×1

flock ×1

php ×1