【问题标题】:file rename on ext3 appears to break POSIX specext3 上的文件重命名似乎违反了 POSIX 规范
【发布时间】:2012-03-07 22:57:23
【问题描述】:

我很难理解我正在运行的测试中发生了什么。测试是在同一台机器上运行的两个 shell 脚本。

答:

    #!/bin/bash
    touch target;
    for ((i=0; i < 1000; i=i+1)); do
        echo "snafu$i" > $1/file$i;
        mv -f $1/file$i $1/target; 
    done; 

乙:

    #!/bin/bash
    while(true);do 
        cat $1/target; 
    done

所以我运行 A /ext3_dir,然后运行 ​​B /ext3_dir > out(所以只有错误会进入标准输出)。

根据 POSIX 规范“重命名”,这一切都可以正常工作:

如果新参数命名的链接存在,则应将其删除并将旧的重命名为新的。在这种情况下,一个名为 new 的链接将在整个重命名操作期间对其他进程保持可见,并在操作开始之前引用 new 或 old 引用的文件。

但是,如果我在移动之前添加到临时文件的硬链接:

    #!/bin/bash
    touch target;
    for ((i=0; i < 1000; i=i+1)); do
        echo "snafu$i" > $1/file$i;
        ln $1/file$i $1/link$i
        mv -f $1/file$i $1/target; 
    done; 

我在读取端收到“没有这样的文件或目录”错误 - 似乎违反了 POSIX 规范。

任何人都可以阐明这种行为吗?测试有效吗?我不明白为什么创建一个指向我正在移动的文件的额外链接会影响从移动目标读取的能力。

【问题讨论】:

  • 应该说:这是在 RHEL5 (2.6.18) 上

标签: posix rename ext3


【解决方案1】:

事实证明这是某些 redhat 版本的已知问题:

https://bugzilla.redhat.com/show_bug.cgi?id=438076

【讨论】:

    【解决方案2】:

    我在 Debian 上运行过它,它在 EXT3 文件系统上运行良好。我在这里看不到任何不应该工作的东西。 我重写了 SH shell 的循环,用最小的脚本对其进行测试。

    #!/bin/sh
        touch target
        for i in $(seq 1 999) do
                echo "snafu$i" > $1/file$i;
                ln $1/file$i $1/link$i
                mv -f $1/file$i $1/target
        done
    

    无论如何,touch target 不应该是touch $1/target

    【讨论】:

    • 是的,在 ext3 上。它是作为 Virtualbox 来宾的股票 Debian。我编辑了答案。
    • 只是为了检查:您同时运行了第二个脚本来读取文件,对吧?
    • 技术上,我启动了第二个脚本before 启动了第一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    相关资源
    最近更新 更多