때 true종료가 파이프의 읽기 측이 폐쇄되어 있지만, yes쓰기 측에 쓰기를 시도 계속합니다. 이 조건을 "깨진 파이프"라고하며 커널이에 SIGPIPE신호를 보냅니다 yes. yes이 신호에 대해 특별한 것은 없기 때문에 죽을 것입니다. 신호를 무시하면 write오류 코드와 함께 호출이 실패합니다 EPIPE. 이를 수행하고 EPIPE기록을 중지 하기 위해 준비해야하는 프로그램 은 무한 루프로 진행됩니다.
strace yes | true1 을 수행 하면 커널이 두 가지 가능성을 준비하는 것을 볼 수 있습니다.
write(1, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 4096) = -1 EPIPE (Broken pipe)
--- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=17556, si_uid=1000} ---
+++ killed by SIGPIPE +++
strace디버거 API를 통해 이벤트를보고 있는데, 먼저 오류와 함께 반환되는 시스템 호출 및 신호에 대해 알려줍니다. 에서 yes의 관점하지만, 먼저 신호가 발생합니다. 기술적으로 커널이 사용자 공간으로 제어를 리턴 한 후 더 많은 기계 명령어가 실행되기 전에 신호가 전달되므로 writeC 라이브러리 의 "래퍼 (wrapper)"기능이 설정 errno되어 애플리케이션으로 리턴 될 기회가 없습니다 .
1 안타깝게도 straceLinux에 따라 다릅니다. 대부분의 현대 유닉스는 비슷한 기능을 수행 하는 명령을 가지고 있지만 종종 다른 이름을 가지고 있으며 아마도 syscall 인수를 완전히 해독하지 않으며 때로는 루트에서만 작동합니다.
yes | tee >(true) >/dev/nulltee모든 작가가 죽을 때까지 계속되는 것처럼 btw는 예상대로 수행 되므로true종료해도 완전히 중단되지는 않습니다.