![파이프라인은 언제 중지해야 하는지 어떻게 알 수 있나요?](https://linux55.com/image/85129/%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8%EC%9D%80%20%EC%96%B8%EC%A0%9C%20%EC%A4%91%EC%A7%80%ED%95%B4%EC%95%BC%20%ED%95%98%EB%8A%94%EC%A7%80%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%95%8C%20%EC%88%98%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
일부 프로그램은 실행 시간이 무제한이고 출력이 무제한일 수 있습니다. 완료 명령과 함께 파이프라인 내에서 사용될 때 파이프라인은 언제 중지해야 하는지 어떻게 알 수 있나요?
예를 들어 yes
(무한 출력)을 사용하면 다음과 같습니다 head
.
yes | head -n 5
5개만 생산됩니다 y
.
종료하는 첫 번째 명령이 다른 프로세스의 입력/출력을 중지하는 명령입니까?
어떻게 작동하나요?
답변1
이 명령은 파이프를 통해 연결됩니다(여기서는 시스템 기본 요소에 대해 이야기하고 있습니다. 분명히 를 통해 연결됩니다 |
). 파이프의 읽기 끝( stdin
of )이 d(== 명시적으로( ) 또는 암시적으로(exit) 닫혀 있는 경우) 쓰기 끝( of ) 에 대한 쓰기 시도는 실패합니다.head
close
head
close
stdout
yes
기본적으로 이는 단순한 errno
오류가 아니라 쓰기 프로세스가 신호를 수신하게 만드는 오류입니다 SIGPIPE
. 기본 핸들러 작업SIGPIPE 신호종료됩니다.
간단히 말해서, 손상된 파이프에 쓰면 시스템은 당신에게 a를 보낼 것이고 SIGPIPE
, 기본적으로 a는 SIGPIPE
당신을 죽일 것입니다. 이것이 마지막에 yes
종료되는 이유입니다 head
(따라서 파이프가 파괴됨).
상위 셸에서 이를 생략하면 SIGPIPE
명령이 이 구성을 상속하고 write
깨진 파이프를 호출하면 이 오류가 문자열화되어 다음과 같이 인쇄됩니다 errno
.EPIPE
yes
$ (trap "" SIGPIPE; yes | head -n 5)
y
y
y
y
yes: standard output: Broken pipe
yes: write error