gpt4 book ai didi

c++ - 锁定文件并避免同一进程访问它两次

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:25 25 4
gpt4 key购买 nike

我正在尝试使用 fcntl() 文件锁来模拟不同进程之间的信号量。

我想在 proc1 中锁定一个虚拟文件并使用 proc2 解锁它;

proc1 将忙于等待 proc2 解锁文件:proc1 将始终检查虚拟文件是否已锁定;如果它被锁定,它将等待;否则,它将继续。

但是,它不起作用!问题是:

如果proc1是通过fcntl()函数获取锁的,当它使用fcntl()函数的F_GETLK命令检查文件是否被锁定时,它总是认为这个文件是解锁的。

我的问题是:如果我想使用锁定机制来实现信号量行为(如上所述),我该怎么办?还有其他更好的方法吗?

我使用的加锁和解锁功能如下:

/*Lock the file and flag unconditionally unless fails in the fcntl()*/
static inline int lock_file(int fd)
{

fd_lock.l_type = F_WRLCK;
fd_lock.l_whence = SEEK_SET;
fd_lock.l_start = 0;
fd_lock.l_len = 0;
err = fcntl(fd, F_SETLK, &fd_lock);
if( err != 0)
{
fprintf(stderr, "Try to lock file %d which was locked by another proc; err=%d, errno=%d\n", fd, err, errno);
return false;
}else{
return true;
}

}

static inline int is_locked(int fd)
{


fd_lock.l_type = F_WRLCK;
fd_lock.l_whence = SEEK_SET;
fd_lock.l_start = 0;
fd_lock.l_len = 0;
err = fcntl(fd, F_GETLK, &fd_lock);
//Could get the lock if not locked by another proc
if(fd_lock.l_type == F_UNLCK)
{
return false;
}else{
return true;
}

}

最佳答案

互斥量和信号量在语义上是不同的。 fcntl 锁(一种互斥锁)有一个所有者,只有所有者才能解锁它们。信号量只有一个计数,任何线程/进程都可以对它们执行递增或等待递减操作。我看不出有什么方法可以从 fcntl 锁中获取信号量语义。

关于c++ - 锁定文件并避免同一进程访问它两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21567741/

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