다음을 입력하면:
cat /dev/urandom
그런 다음 데이터를 출력하는 데 시간이 오래 걸리지만 다음과 같습니다.
cat /dev/urandom | head -c 10
출력은 임의의 10바이트 후에 종료됩니다. 이는 head
출력이 어떻게든 완료되었음을 의미 합니까 cat
?
답변1
판독기가 없는 파이프에 쓰려고 하면 cat
신호를 받게 됩니다(그리고 종료되면 자동으로 표준 입력을 닫습니다. 이는 파이프의 읽기 끝 부분에 대한 유일한 열린 핸들이기도 합니다).SIGPIPE
head
만약 너라면어떻게든파이프의 읽기 끝 부분에 또 다른 핸들을 가져오면 고양이는 끝나지 않을 것입니다.막힌파이프 버퍼를 채운 후:
(Linux에만 해당되는 예):
cat /dev/urandom 3</dev/stdout | head -c 10 > /tmp/junk
<staying there until you ^C>
또한, 당신이 도착 cat
하면소홀히 하다signal SIGPIPE
, 신호를 생성하는 쓰기는 단순히 실패하고 = 로 SIGPIPE
설정됩니다 .errno
EPIPE
Broken pipe
^1:
{ trap '' PIPE; cat /dev/urandom; } | head -c 10 >/tmp/junk
cat: write error: Broken pipe
이 head
과정은 이것과 아무 관련이 없습니다. 하지만 사실은 그렇지 않아요신호,지시하다아니면 전혀 신경쓰지 마십시오 cat
. 필요한 것은 무엇이든 읽은 다음 종료하고 나머지는 모두 운영 체제에 맡깁니다.
^1이 후자의 동작(매우 짜증나는)은 Python 스크립트의 기본 동작입니다.
python -c 'while 1: print("hello")' | head -n2
hello
hello
Traceback (most recent call last):
File "<string>", line 1, in <module>
IOError: [Errno 32] Broken pipe