在Linux上使用O_RDWR打开() O_CREAT |如果文件位于Win10 PC的samba共享上,是O_EXCL原子的吗?

时间:2019-06-04 18:11:05

标签: c++ linux samba

我正在将一些使用锁定文件的代码从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);

2 个答案:

答案 0 :(得分:3)

我认为您在这里安全。我快速浏览了SMB protocol documentation,并有一个FILE_CREATE标志可以做到这一点:

  

如果文件已经存在,则操作必须失败。如果该文件尚不存在,则应创建该文件。

当然是您想要的。

答案 1 :(得分:2)

  

如果多个,以下函数调用将是原子的   运行我的软件的计算机正在尝试在以下位置创建锁定文件   同时?我不在乎是谁得到的,只要一个人得到   锁定,其他所有都不锁定。对于那些没有锁的人   期望open返回-1。

据我所知,文件驻留在Samba共享上,并且有多个不同的计算机正在尝试访问该文件,这一事实并不干扰open()的行为,如所涉及的每台计算机所指定的那样。特别是,如果除了执行您提出的open()调用的进程以外,没有其他进程尝试创建或删除文件,则这些调用中的最多一个将成功,返回文件描述符,而所有其他调用将失败,返回-1。但是请注意,它们中的全部可能会失败。

万一发生故障,您需要检查errno的值以确定原因;如果失败是由于文件已存在而导致的,则它将采用值EEXIST,但是也可能采用各种各样的其他值。这些问题在问题链接的手册页中进行了描述。