head 다음 명령에서 cat을 중지하는 방법: cat /dev/urandom | head -c 10

head 다음 명령에서 cat을 중지하는 방법: cat /dev/urandom | head -c 10

다음을 입력하면:

cat /dev/urandom

그런 다음 데이터를 출력하는 데 시간이 오래 걸리지만 다음과 같습니다.

cat /dev/urandom | head -c 10

출력은 임의의 10바이트 후에 종료됩니다. 이는 head출력이 어떻게든 완료되었음을 의미 합니까 cat?

답변1

판독기가 없는 파이프에 쓰려고 하면 cat신호를 받게 됩니다(그리고 종료되면 자동으로 표준 입력을 닫습니다. 이는 파이프의 읽기 끝 부분에 대한 유일한 열린 핸들이기도 합니다).SIGPIPEhead

만약 너라면어떻게든파이프의 읽기 끝 부분에 또 다른 핸들을 가져오면 고양이는 끝나지 않을 것입니다.막힌파이프 버퍼를 채운 후:

(Linux에만 해당되는 예):

cat /dev/urandom 3</dev/stdout | head -c 10 > /tmp/junk
<staying there until you ^C>

또한, 당신이 도착 cat하면소홀히 하다signal SIGPIPE, 신호를 생성하는 쓰기는 단순히 실패하고 = 로 SIGPIPE설정됩니다 .errnoEPIPEBroken 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

관련 정보