파이프라인은 언제 중지해야 하는지 어떻게 알 수 있나요?

파이프라인은 언제 중지해야 하는지 어떻게 알 수 있나요?

일부 프로그램은 실행 시간이 무제한이고 출력이 무제한일 수 있습니다. 완료 명령과 함께 파이프라인 내에서 사용될 때 파이프라인은 언제 중지해야 하는지 어떻게 알 수 있나요?

예를 들어 yes(무한 출력)을 사용하면 다음과 같습니다 head.

 yes | head -n 5

5개만 생산됩니다 y.

종료하는 첫 번째 명령이 다른 프로세스의 입력/출력을 중지하는 명령입니까?
어떻게 작동하나요?

답변1

이 명령은 파이프를 통해 연결됩니다(여기서는 시스템 기본 요소에 대해 이야기하고 있습니다. 분명히 를 통해 연결됩니다 |). 파이프의 읽기 끝( stdinof )이 d(== 명시적으로( ) 또는 암시적으로(exit) 닫혀 있는 경우) 쓰기 끝( of ) 에 대한 쓰기 시도는 실패합니다.headcloseheadclosestdoutyes

기본적으로 이는 단순한 errno오류가 아니라 쓰기 프로세스가 신호를 수신하게 만드는 오류입니다 SIGPIPE. 기본 핸들러 작업SIGPIPE 신호종료됩니다.

간단히 말해서, 손상된 파이프에 쓰면 시스템은 당신에게 a를 보낼 것이고 SIGPIPE, 기본적으로 a는 SIGPIPE당신을 죽일 것입니다. 이것이 마지막에 yes종료되는 이유입니다 head(따라서 파이프가 파괴됨).


상위 셸에서 이를 생략하면 SIGPIPE명령이 이 구성을 상속하고 write깨진 파이프를 호출하면 이 오류가 문자열화되어 다음과 같이 인쇄됩니다 errno.EPIPEyes

$ (trap "" SIGPIPE; yes | head -n 5)  
y
y
y
y
yes: standard output: Broken pipe
yes: write error

관련 정보