在 Linux 上打开() 与 O_RDWR |O_CREAT |如果文件位于 Win10 PC 的桑巴共享上,O_EX



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

我为此使用带有O_CREAT | O_EXCL的 linuxopen(),因此它只能通过创建文件(如果它不存在)来成功。 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);

我认为你在这里是安全的。 我快速浏览了SMB协议文档,有一个FILE_CREATE标志可以做到这一点:

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

这当然是你想要的。

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

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

如果失败,您需要检查errno的值以确定原因;如果失败是由已存在的文件引起的,它将采用该值EEXIST,但也可能需要各种其他值。 除其他地方外,这些问题在问题中链接的手册页中都有描述。

最新更新