때 true
종료가 파이프의 읽기 측이 폐쇄되어 있지만, yes
쓰기 측에 쓰기를 시도 계속합니다. 이 조건을 "깨진 파이프"라고하며 커널이에 SIGPIPE
신호를 보냅니다 yes
. yes
이 신호에 대해 특별한 것은 없기 때문에 죽을 것입니다. 신호를 무시하면 write
오류 코드와 함께 호출이 실패합니다 EPIPE
. 이를 수행하고 EPIPE
기록을 중지 하기 위해 준비해야하는 프로그램 은 무한 루프로 진행됩니다.
strace yes | true
1 을 수행 하면 커널이 두 가지 가능성을 준비하는 것을 볼 수 있습니다.
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
의 관점하지만, 먼저 신호가 발생합니다. 기술적으로 커널이 사용자 공간으로 제어를 리턴 한 후 더 많은 기계 명령어가 실행되기 전에 신호가 전달되므로 write
C 라이브러리 의 "래퍼 (wrapper)"기능이 설정 errno
되어 애플리케이션으로 리턴 될 기회가 없습니다 .
1 안타깝게도 strace
Linux에 따라 다릅니다. 대부분의 현대 유닉스는 비슷한 기능을 수행 하는 명령을 가지고 있지만 종종 다른 이름을 가지고 있으며 아마도 syscall 인수를 완전히 해독하지 않으며 때로는 루트에서만 작동합니다.
yes | tee >(true) >/dev/null
tee
모든 작가가 죽을 때까지 계속되는 것처럼 btw는 예상대로 수행 되므로true
종료해도 완전히 중단되지는 않습니다.