ext3上的文件重命名似乎打破了POSIX规范

时间:2012-03-02 15:15:51

标签: posix rename ext3

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

A:

    #!/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; 

B:

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

所以我运行A / ext3_dir,然后运行B / ext3_dir&gt; out(所以只有错误才会出现)。

根据POSIX规范'重命名',这一切都正常并且符合预期:

  

如果新参数指定的链接存在,则应将其删除并将旧名称重命名为new。在这种情况下,名为new的链接在整个重命名操作中对其他进程仍然可见,并且在操作开始之前引用新旧引用的文件。

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

    #!/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规范。

任何人都可以对这种行为有所了解吗?测试有效吗?我无法弄清楚为什么创建一个额外的链接到我正在移动的文件会影响从移动目的地读取的能力。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我在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