锁定文件,避免使用相同的过程以访问两次

lock a file and avoid the same process to access it twice

本文关键字:访问 过程 两次 文件 锁定      更新时间:2023-10-16

我正在尝试使用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=%dn", 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锁中获得信号量语义。