锁定文件,避免使用相同的过程以访问两次
lock a file and avoid the same process to access it twice
我正在尝试使用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
锁中获得信号量语义。
相关文章:
- 通过方法访问结构
- 递归函数计算序列中的平方和(并输出过程)
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 在窗口过程包装器中阅读访问违规
- boost :: filesystem :: verver()无法访问文件,因为另一个过程正在使用该文件
- 锁定文件,避免使用相同的过程以访问两次
- 在c++编译过程中,私有访问和公共访问是如何工作的
- 在无法访问的目的地上 ICMP 回显请求/回复的正确过程是什么