2012-03-02 25 views
2

我很努力去理解正在运行的测试中发生了什么。测试是在同一台机器上运行的两个shell脚本。文件重命名ext3似乎打破POSIX规范

答:

#!/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>出来(所以只有错误去到std出)。

这一切工作正常,并根据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规范。

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

+0

应该说:这是在RHEL5(2.6.18) – 2012-03-03 15:12:05

回答

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

+0

ext3文件系统上? – 2012-03-04 23:01:35

+0

是的,在ext3上。这是一个股票Debian作为一个VirtualBox客户。我编辑了答案。 – karatedog 2012-03-05 07:11:21

+0

只需检查:您同时运行第二个脚本读取文件,对吧? – 2012-03-05 09:07:09