다음 명령의 효과를 이해하는 데 문제가 있습니다.
yes | tee hello | head
내 노트북에서 "hello"의 줄 수는 약 36,000개로 표준 출력에 표시된 10개 줄보다 훨씬 많습니다.
내 질문은 다음과 같습니다
yes
, 더 일반적으로는 파이프라인의 명령이 언제 중지됩니까?위의 두 숫자가 일치하지 않는 이유는 무엇입니까?
tee
파이프라인의 다음 명령으로 행이 하나씩 전달되지 않기 때문입니까 ?
답변1
:> yes | strace tee output | head
[...]
read(0, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = 8192
write(1, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = 8192
write(3, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = 8192
read(0, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = 8192
write(1, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = -1 EPIPE (Broken pipe)
--- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=5202, si_uid=1000} ---
+++ killed by SIGPIPE +++
에서 man 2 write
:
EPIPE
fd 읽기 끝이 닫힌 파이프나 소켓에 연결합니다. 이런 일이 발생하면 쓰기 프로세스도 SIGPIPE 신호를 수신합니다.
따라서 프로세스는 오른쪽에서 왼쪽으로 죽습니다. head
자체적으로 종료되며 tee
종료 후 파이프에 처음으로 쓰려는 시도에서 종료됩니다. 죽은 후에도 head
똑같은 일이 일어납니다 .yes
tee
tee
버퍼가 가득 찰 때까지 파이프에 쓸 수 있습니다. 그러나 파일에 임의의 내용을 쓸 수 있습니다. 내 버전이 파일 tee
에 동일한 블록을 쓰는 것 같습니다 .stdout
head
커널의 읽기 버퍼는 8K입니다. 모든 것을 읽지만 이것이 작업이기 때문에 처음 10줄만 인쇄합니다.
답변2
파이프에 쓰는 프로그램은 다음을 수신합니다.신호 파이프라인파이프 판독기가 종료될 때 발생하며 tee(1)은 표준 입력이 열려 있는 한 종료되지 않습니다.
head(1)은 기본적으로 10줄을 출력합니다.