我正在尝试使用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;
}
}
答案 0 :(得分:4)
互斥锁和信号量在语义上是不同的。 fcntl
锁(这是一种互斥锁)拥有所有者,只有所有者才能解锁它们。信号量只需要一个计数,任何线程/进程都可以对它们执行增量或等待减量操作。我没有看到任何方法从fcntl
锁获得信号量语义。