2013-07-25 3 views
1

는 아래 cmd를 날 설명해주십시오 : 두 가지 다른 백그라운드 프로세스가 유닉스에서 동일한 파일에 액세스하면 어떻게됩니까?

touch temp.txt 
touch temp1.txt 
who > temp.txt & 
cat temp.txt | wc -l >temp1.txt & 

는 TEMP.TXT 파일은 빈 파일에 대해 말한다. 그러면 실행 후 temp.txttemp1.txt 개의 파일에 무엇이 나타날 것입니다.

작업이 백그라운드 모드에서 실행 중이므로 누군가가 가능한 경우를 설명 할 수 있습니까? , 그래서 당신은 무슨 일이 일어날 지 예측할 수 없다

+4

다릅니다. 일반적으로 : 나쁜 것. – Ingo

+0

정의되지 않은 동작이 발생합니다. –

+2

두 개의 전경 프로세스가 동일한 파일에 액세스하는 경우 발생하는 상황과 특별히 다른 것은 없습니다. 타이밍과 버퍼링은 둘 다 결정적이지 않은 결과에서 중요한 역할을합니다. – jlliagre

답변

0

cat이 실행 temp.txt의 상태가 당신의 통제를 벗어난는 (서로 catwho 실행 상대 할 때 스케줄러에게 달려 있습니다). 더 안전한 버전은

# These two commands are unnecessary. The files will be created 
# when opened for writing. 
# touch temp.txt 
# touch temp1.txt 
who | tee temp.txt | wc -l > temp1.txt & # If it really needs to run in the background 
0

에 달려 있습니다. cat(1)은 입력 파일에 무언가 또는 무언가를 볼 수 있습니다.

다음은 마지막 두 명령에서 일어나는 일의 매우 거친 그림입니다.

  • who >f1
    아이가 갈래가, 사방 출력 파일, 출력 파일이 자녀의 표준 출력으로 이동 (그들은 동기 때문에 나는. touch(1) 호출을 무시하고있어), 새로운 프로그램이 실행됩니다.
  • cat f2 | wc -l>f2
    자식이 분기되고, 파이프가 만들어지고, 다른 자식이 분기되고, 자식이 파이프 입력을 stdin 또는 stdout으로 적절하게 이동합니다. 한 자식은 입력 파일을 열고 다른 자식 복제자는 출력을, 위와 같이.

내가 그 쉘이하고있는 사실은 무엇을 보장하지 않습니다 - 어쩌면 전에 그것을 포크 등을 내리 쳤을 -하지만 그건 충분히 가까이입니다. 자, 시간 차원에서 이러한 쉘 명령을 넣을 수 있도록 다음 -?-> 화살표의

[time =====================================================================>] 

# who >f1 
-?->[clobber *f1*]-?->[dup to stdout]-?->[exec who(1)]-?->[...] 

# cat f1 | wc -l>f2 
-?->[pipe]-?->[fork]-?->[dup pipe]-?->[clobber *f2*]-?->[dup to stdout]-?->[exec wc(1)] 
       +----?->[dup pipe]-?->[exec cat(1)]-?->[open *f1*]-?->[...] 

모든 사람이 위의 임의의 매수 또는 매도 할 수있다 - 당신이 그것을 제어 할 수 없습니다. 어쩌면 cat(1)보다 먼저 실행되어 (첫 번째 데이터를 보는 것?)이 아닐지도 모릅니다. 어쩌면 그것이 실행되기 전에 who(1) 출력을 작성하는 기회가있을 수도 있습니다.