gpt4 book ai didi

c - 羊群(): removing locked file without race condition?

转载 作者:太空狗 更新时间:2023-10-29 16:27:53 24 4
gpt4 key购买 nike

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

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

do_something();

unlink(lockfile);
flock(fd, LOCK_UN);

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

但是,这段代码中存在明显的竞争条件;进程 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 !)

有没有办法在不引入竞争条件的情况下在某个时候删除锁定文件?

最佳答案

抱歉,如果我回答一个死问题:

锁定文件后,打开它的另一个副本,fstat 两个副本并检查 inode 号,如下所示:

lockfile = "/tmp/some_name.lock";

while(1) {
fd = open(lockfile, O_CREAT);
flock(fd, LOCK_EX);

fstat(fd, &st0);
stat(lockfile, &st1);
if(st0.st_ino == st1.st_ino) break;

close(fd);
}

do_something();

unlink(lockfile);
flock(fd, LOCK_UN);

这可以防止竞争条件,因为如果一个程序持有对仍在文件系统上的文件的锁定,则所有其他具有剩余文件的程序都将具有错误的 inode 编号。

我实际上在状态机模型中使用以下属性证明了这一点:

如果 P_i 在文件系统上锁定了一个描述符,则临界区中没有其他进程。

如果 P_i 在具有正确 inode 的 stat 之后或在临界区中,它的描述符已锁定在文件系统上。

关于c - 羊群(): removing locked file without race condition?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17708885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com