에 달려 있습니다. 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)
출력을 작성하는 기회가있을 수도 있습니다.
다릅니다. 일반적으로 : 나쁜 것. – Ingo
정의되지 않은 동작이 발생합니다. –
두 개의 전경 프로세스가 동일한 파일에 액세스하는 경우 발생하는 상황과 특별히 다른 것은 없습니다. 타이밍과 버퍼링은 둘 다 결정적이지 않은 결과에서 중요한 역할을합니다. – jlliagre