2012-03-02 3 views
2

나는 현재 실행중인 테스트에서 어떤 일이 벌어지고 있는지 이해하려고 애쓰고 있습니다. Test는 동일한 시스템에서 실행되는 두 개의 쉘 스크립트입니다.ext3에 파일 이름 바꾸기가 POSIX 사양을 위반하는 것으로 나타납니다

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> 아웃 (그래서 오류 만 밖으로 수 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

말한해야 :이 ext3 파일 시스템 (2.6.18) –

답변

0

데비안에서 실행했으며 EXT3 파일 시스템에서 정상적으로 작동했습니다. 나는 여기서 작동해서는 안되는 것을 볼 수 없다. 최소한의 스크립트로 테스트하기 위해 SH 쉘용 루프를 다시 작성했습니다.

어쨌든
#!/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 targettouch $1/target 안?

+0

RHEL5에? –

+0

예, ext3. 버추얼 박스 게스트로서의 데비안입니다. 나는 그 대답을 편집했다. – karatedog

+0

그냥 확인 : 동시에 두 번째 스크립트를 실행하여 파일을 읽었습니까? –

관련 문제