c++ - 最优锁文件方法

标签 c++ unix file locking

Windows 可以选择以独占访问权限打开文件。 Unix 没有。

为了确保对某些文件或设备的独占访问,在 Unix 中通常使用通常存储在/var/lock 目录中的锁定文件。

C 指令 open( "/var/lock/myLock.lock", O_RDWR | O_CREAT | O_EXCL, 0666 ) 如果锁文件已经存在则返回 -1,否则创建它。该函数是原子的,并确保没有竞争条件。

释放资源时,通过如下指令删除锁文件 remove("/var/lock/myLock.lock").

这种方法有两个问题。

  1. 程序可能会在不解除锁定的情况下终止。例如,因为它被杀死、崩溃或其他原因。锁定文件保留在原位,即使不再使用该资源,也会阻止对资源的任何访问。

  2. 锁定文件是使用组和世界写入权限创建的,但通常的做法是配置帐户以使用权限掩码来清除组和世界写入权限。因此,如果我们有一个可靠的方法来确定锁是孤立的(未使用),则不允许非文件所有者的用户删除它。

作为记录,我使用锁定文件来确保对连接到串行端口的设备(实际上是/dev/ttyUSBx)的独占访问。咨询方式,需要配合,是可以的。但应确保不同用户之间的独占访问。

有没有比锁文件更好的同步方式?如何判断创建锁文件的进程是否还在运行? 如果不使用,如何使其他用户可以删除锁定文件?

我想出的一个解决方案是将该文件用作 Unix 套接字文件。如果该文件存在,请尝试使用该文件进行连接。如果失败,我们可以假设文件的所有者进程已经死了。这需要在所有者进程中的套接字 accept() 上有一个线程循环。不幸的是,系统将不再是原子的。

最佳答案

看看富有启发性的演示File Locking Tricks and Traps :

This short talk presents several common pitfalls of file locking and a few useful tricks for using file locking more effectively.

编辑:更准确地解决您的问题:

Is there a better synchronization method than the lock file?

正如@Hasturkun 已经提到的和上面的演示文稿所说,您需要使用的系统调用是flock(2) .如果您希望在多个用户之间共享的资源已经是基于文件的(在您的情况下是 /dev/ttyUSBx),那么您可以 flock设备文件本身

How to determine if the process who created the lock file is still running?

您不必确定这一点,因为 flock-ed 锁将在关闭与您的文件关联的文件描述符时自动释放,即使进程已终止。

How making it possible for another user to remove the lock file if not in use?

如果您要锁定设备文件本身,则无需删除该文件。即使您决定在 /var/lock 中锁定一个普通文件,使用 flock 您也无需删除该文件即可释放锁定。

关于c++ - 最优锁文件方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1599459/

相关文章:

java - 重命名 Swing 组件使用的文件

c++ - 继承和指向指针 : why doesn't it work and how do I get around it? 的指针

c++ - 带有命令行参数的 C++ Makefile 和 Bash 脚本

c - "C system calls"和 "C library routines"有什么区别?

php - 删除文件中的完全匹配

shell - 如何将 shell 脚本的所有输出写入单个新文件

c++ - std::reference_wrapper<T> 的隐式 T& 构造函数是否会使使用变得危险?

.net - 命名管道 : C++ vs . NET 4.0

c++ - C++ 中的语言转换器(从日语到英语)

c - 您会使用退出处理程序做什么?