在Linux上创buildprimefaces文件?

如果文件不存在,我需要创build一个文件,以另一个尝试创build该文件的进程失败。 即使在创build过程完成将实际数据写入之前,我也需要将该文件视为“已创build”。

我读了关于O_EXCL标志open() ,所以似乎解决scheme存在,但我有几个问题:

  1. 你有这种技术的经验吗? 它有多好? (我想我不能拥有数据库级别的primefaces性,但是足够好的就是…足够了)
  2. 我应该立即closuresopen()之后的文件,以便它被认为是创build,然后重新打开它的写作?
  3. 有没有什么微妙的意识到?

open()手册页说您的方法可能会在NFS上失败。

从O_EXCL部分:

当与O_CREAT一起使用时,如果该文件已经存在,则是错误,并且open()将失败。 在这种情况下,存在一个符号链接,不管它指向何处。 O_EXCL在NFS文件系统上被破坏; 依靠它来执行锁定任务的程序将包含竞争条件。

这表明一个更一般的解决方案:

使用lockfile执行原子文件锁定的解决方案是在同一个文件系统上创建一个唯一的文件(例如,包含主机名和pid),使用link(2)创建一个到lockfile的链接。 如果link()返回0,则锁定成功。 否则,在唯一文件上使用stat(2)来检查它的链接数是否增加到2,在这种情况下,锁也是成功的。

有关各种问题和方法的更多详细信息,请参阅本网页的“使用文件锁定”部分。

POSIX说:

如果设置了O_CREAT和O_EXCL,则如果文件存在,则open()将失败。 检查文件的存在以及文件的创建(如果文件不存在),对于执行open()的其他线程来说,它们应该是原子的,并且在设置了O_EXCL和O_CREAT的同一目录中命名相同的文件名。

因此,使用O_EXCL其他进程会在创建后立即将其打开。