是rename()primefaces吗?

我无法通过实验来检查,也无法从手册中收集。

假设我有两个进程,一个从directory1移动(重命名)file1到directory2。 假设正在运行的其他进程将directory1和directory2的内容复制到另一个位置。 是否有可能复制发生在这样一种方式,目录1和目录2将显示file1.ie目录1复制之前的移动和目录2移动后的第一个进程。

基本上是rename()一个primefaces系统调用?

谢谢

Solutions Collecting From Web of "是rename()primefaces吗?"

是和不是。

重命名()是原子假设操作系统不会崩溃。 它不能被任何其他文件系统分割。

如果系统崩溃,您可能会看到一个ln()操作。

另外请注意,在网络文件系统上运行时,操作成功完成后,您可能会收到ENOENT。 本地文件系统不能这样对你。

这是一个非常晚的答案,但是… rename()是原子,但不是在你的问题意义上。 在Linux下, rename(2)说:

但是,覆盖时,可能会出现一个窗口,其中oldpath和newpath指向正在重命名的文件。

rename()在一个非常重要的意义上仍然是原子的:如果你用它来覆盖文件,那么你将最终得到旧版本或新版本,而没有其他的。

[ 更新:但作为@ jonas-wielicki在评论中指出,你需要确保你正在重命名的文件实际上有最新的内容,使用fsync()和朋友。]

如果newpath已经存在,它将被原子替换(受到几个条件的影响;请参阅下面的ERRORS),这样就没有任何其他进程尝试访问新路径会发现它丢失。

如果你看到错误,你会发现重命名可能会失败,但它永远不会破坏原子性。

这一切都来自Linux手册页。 我不知道的是,如果在服务器运行不同操作系统的网络文件系统上执行rename() 。 客户有没有保证原子性的希望呢? 我对此表示怀疑。

我不确定你的问题的“基本”部分是否有效。 除非两者之间有某种同步,否则原子重命名是无关紧要的。 如果目录副本在重命名之前到达那里,您将在两个地方都有file1。

我不确定你的意思是线程还是进程,但是如果两者都有锁定机制的话,线程锁是最简单的,因为它们不必跨越进程边界。

要检查这一点,请尝试使用strace来查看所有的系统调用。

虽然,你的情况,你有没有考虑使用符号链接? 在生产系统中,我使用符号链接指向今天的日期,以便多日操作使用正确的值。