C++ 如果文件位于Win10 PC的samba共享上,linux上的open()是否具有O|RDWR | O|u CREAT | O|u exc原子?

C++ 如果文件位于Win10 PC的samba共享上,linux上的open()是否具有O|RDWR | O|u CREAT | O|u exc原子?,c++,linux,samba,C++,Linux,Samba,我正在将一些代码从Win32移植到使用锁文件的Linux。 我使用open为Linux做了一个实现,但是我不确定如果文件在Samba共享上,它是否会工作。我试过了,但我不确定它有多可靠 为此,我将linuxopen()与O|u create | O_EXCL一起使用,这样,只有在文件不存在时,它才能通过创建文件成功。 如果运行我的软件的多台计算机同时尝试创建锁文件,那么下面的函数调用将是原子的吗?我不在乎谁拿到锁,只要只有一个人拿到锁,其他人都没有。对于那些没有得到锁的人,我希望open返回-

我正在将一些代码从Win32移植到使用锁文件的Linux。 我使用
open
为Linux做了一个实现,但是我不确定如果文件在Samba共享上,它是否会工作。我试过了,但我不确定它有多可靠

为此,我将linux
open()
O|u create | O_EXCL
一起使用,这样,只有在文件不存在时,它才能通过创建文件成功。

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

m_iFileDescriptor = open(m_sPath.c_str(), O_RDWR|O_CREAT|O_EXCL, 0666);
如果有多个函数调用,下面的函数调用将是原子的吗 运行我的软件的计算机正在尝试在以下位置创建锁文件: 同时?我不在乎谁得到它,只要只有一个得到它 锁了,其他的都没有。对于那些没有锁的人,我 希望
open
返回-1

m_iFileDescriptor = open(m_sPath.c_str(), O_RDWR|O_CREAT|O_EXCL, 0666);
据我所知,文件驻留在Samba共享上以及多台不同的计算机正在尝试访问它的事实不会影响
open()
在每台相关计算机上的指定行为。特别是,如果除了执行您提出的
open()
调用的进程之外,没有进程尝试创建或删除文件,那么这些调用中最多有一个会成功,返回文件描述符,而所有其他调用都会失败,返回-1。但是,请注意,它们都有可能失败


如果出现故障,您需要检查
errno
的值以确定原因;如果故障是由于文件已经存在而导致的,则它将采用值
EEXIST
,但也可能采用多种其他值。除其他地方外,这些都在问题链接的手册页面中进行了描述。

我认为您在这里是安全的。我快速查看了一下,发现有一个
文件\u CREATE
标志,它执行以下操作:

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


这当然是你想要的。

这里原子这个词是什么意思?自动?@0x476f72616e,“原子”意味着好像一条指令同时执行,在调用开始和返回之间没有可观察的中间状态。对于OP的意思来说,这实际上并不完全是正确的术语——这将是足够的,但它不是必需的——但这一段的其余部分已经足够清楚了。谢谢!希望其他人会证实这一点。我们的代码可以接收超时/持续时间作为参数,因此如果失败,我们可以重试。所以对我们来说唯一的问题是确保只有一台机器得到锁。