我正在将一些代码从Win32移植到使用锁文件的Linux上。我用open
为Linux做了一个实现,但我只是不确定如果文件在Samba共享上,它是否会工作。我试过了,它似乎可以工作,但我不确定它有多可靠。
为此,我使用带有O_CREAT | O_EXCL
的linux open()
,以便只有在文件尚不存在时才能成功创建该文件。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);
发布于 2019-06-05 03:56:49
我认为你在这里是安全的。我快速浏览了一下SMB protocol documentation,发现有一个FILE_CREATE
标志可以做到这一点:
如果文件已存在,则操作必须失败。如果该文件不存在,则应创建该文件。
当然这就是你想要的。
发布于 2019-06-05 03:01:07
如果多台运行我的软件的计算机同时尝试创建锁文件,那么下面的函数调用会是原子的吗?我不关心谁得到了锁,只要只有一个人得到了锁,所有其他人都没有得到锁。对于那些没有得到锁的人,我希望
open
返回-1。
据我所知,该文件驻留在一个Samba共享上,并且多台不同的机器正在尝试访问它,这一事实不会影响每台涉及的机器上指定的open()
行为。具体地说,如果除了执行您提供的open()
调用的进程之外,没有其他进程正在尝试创建或删除文件,那么这些调用中最多有一个会成功,返回一个文件描述符,而所有其他调用都会失败,返回-1。但是,请注意,它们都有可能失败。
在失败的情况下,您需要检查errno
的值以确定原因;如果失败是由已经存在的文件引起的,那么它将采用值EEXIST
,但它也可能采用各种各样的其他值。在问题中链接的手册页面中对这些内容进行了描述。
https://stackoverflow.com/questions/56449257
复制相似问题