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

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

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

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

这种方法有两个问题。

  • 程序可能会在不删除锁的情况下终止。例如,因为它被杀死,崩溃或其他原因。锁定文件将保留在原处,即使不再使用该文件也将阻止对该资源的任何访问。
  • 锁定文件是使用组和世界写入权限创建的,但是通常的做法是将帐户配置为使用权限掩码,以清除组和世界写入权限。因此,如果我们有可靠的方法来确定该锁是孤立的(不使用),则将不允许非文件所有者的用户删除该锁。

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

    有没有比锁定文件更好的同步方法?如何确定创建锁定文件的进程是否仍在运行?
    如果不使用,如何使另一个用户删除锁定文件?

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

    最佳答案

    看看启发性的演示文稿File Locking Tricks and Traps:



    编辑:要更精确地解决您的问题,请执行以下操作:



    正如@Hasturkun已经提到的那样,并且如上面的演示所示,您需要使用的系统调用是 flock(2) 。如果您想在许多用户之间共享的资源已经基于文件(在您的情况下为/dev/ttyUSBx),则可以对设备文件本身进行flock



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



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

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

    10-11 22:22
    查看更多