2012-03-02 42 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