我正在将一些使用锁定文件的代码从Win32移植到Linux。
我在Linux上使用open
进行了实现,但是我不确定文件是否在Samba共享上是否可以正常工作。我试过了,它似乎可以正常工作,但是我不确定它的可靠性。
我为此使用了Linux open()
和O_CREAT | O_EXCL
,因此只有在文件不存在时才通过创建文件来成功。
http://man7.org/linux/man-pages/man2/open.2.html
如果运行我的软件的多台计算机试图同时创建锁定文件,则以下函数调用是否是原子的?我不在乎是谁得到的,只要只有一个能得到锁,而其他所有人都不会。对于那些没有锁的人,我希望open
返回-1。
m_iFileDescriptor = open(m_sPath.c_str(), O_RDWR|O_CREAT|O_EXCL, 0666);
答案 0 :(得分:3)
我认为您在这里安全。我快速浏览了SMB protocol documentation,并有一个FILE_CREATE
标志可以做到这一点:
如果文件已经存在,则操作必须失败。如果该文件尚不存在,则应创建该文件。
当然是您想要的。
答案 1 :(得分:2)
如果多个,以下函数调用将是原子的 运行我的软件的计算机正在尝试在以下位置创建锁定文件 同时?我不在乎是谁得到的,只要一个人得到 锁定,其他所有都不锁定。对于那些没有锁的人 期望
open
返回-1。
据我所知,文件驻留在Samba共享上,并且有多个不同的计算机正在尝试访问该文件,这一事实并不干扰open()
的行为,如所涉及的每台计算机所指定的那样。特别是,如果除了执行您提出的open()
调用的进程以外,没有其他进程尝试创建或删除文件,则这些调用中的最多一个将成功,返回文件描述符,而所有其他调用将失败,返回-1。但是请注意,它们中的全部可能会失败。
万一发生故障,您需要检查errno
的值以确定原因;如果失败是由于文件已存在而导致的,则它将采用值EEXIST
,但是也可能采用各种各样的其他值。这些问题在问题链接的手册页中进行了描述。