首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果文件在Win10 PC上的samba共享上,在带有O_RDWR | O_CREAT | O_EXCL的linux上的open()是原子的吗?

如果文件在Win10 PC上的samba共享上,在带有O_RDWR | O_CREAT | O_EXCL的linux上的open()是原子的吗?
EN

Stack Overflow用户
提问于 2019-06-05 02:11:05
回答 2查看 424关注 0票数 2

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

为此,我使用带有O_CREAT | O_EXCL的linux open(),以便只有在文件尚不存在时才能成功创建该文件。http://man7.org/linux/man-pages/man2/open.2.html

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

代码语言:javascript
复制
m_iFileDescriptor = open(m_sPath.c_str(), O_RDWR|O_CREAT|O_EXCL, 0666);
EN

回答 2

Stack Overflow用户

发布于 2019-06-05 03:56:49

我认为你在这里是安全的。我快速浏览了一下SMB protocol documentation,发现有一个FILE_CREATE标志可以做到这一点:

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

当然这就是你想要的。

票数 3
EN

Stack Overflow用户

发布于 2019-06-05 03:01:07

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

据我所知,该文件驻留在一个Samba共享上,并且多台不同的机器正在尝试访问它,这一事实不会影响每台涉及的机器上指定的open()行为。具体地说,如果除了执行您提供的open()调用的进程之外,没有其他进程正在尝试创建或删除文件,那么这些调用中最多有一个会成功,返回一个文件描述符,而所有其他调用都会失败,返回-1。但是,请注意,它们都有可能失败。

在失败的情况下,您需要检查errno的值以确定原因;如果失败是由已经存在的文件引起的,那么它将采用值EEXIST,但它也可能采用各种各样的其他值。在问题中链接的手册页面中对这些内容进行了描述。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56449257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档