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/