【发布时间】: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) 上