【问题标题】:lock a file and avoid the same process to access it twice锁定一个文件并避免同一个进程访问它两次
【发布时间】:2014-02-05 02:52:30
【问题描述】:

我正在尝试使用 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;
    }

}

【问题讨论】:

    标签: c++ c linux multithreading


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多