Saat true
keluar, sisi baca pipa ditutup, tetapi yes
terus mencoba menulis ke sisi tulis. Kondisi ini disebut "pipa rusak", dan menyebabkan kernel mengirim SIGPIPE
sinyal yes
. Karena yes
tidak melakukan sesuatu yang istimewa pada sinyal ini, itu akan dibunuh. Jika mengabaikan sinyal, write
panggilannya akan gagal dengan kode kesalahan EPIPE
. Program yang melakukan itu harus dipersiapkan untuk memperhatikan EPIPE
dan berhenti menulis, atau mereka akan masuk ke loop yang tak terbatas.
Jika Anda melakukan strace yes | true
1, Anda dapat melihat kernel mempersiapkan kedua kemungkinan:
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
sedang menonton acara melalui API debugger, yang pertama kali memberitahukannya tentang panggilan sistem yang kembali dengan kesalahan, dan kemudian tentang sinyal. Namun dari yes
perspektif, sinyal terjadi terlebih dahulu. (Secara teknis, sinyal dikirim setelah kernel mengembalikan kontrol ke ruang pengguna, tetapi sebelum instruksi mesin dijalankan lagi, sehingga fungsi write
"pembungkus" di perpustakaan C tidak mendapatkan kesempatan untuk mengatur errno
dan kembali ke aplikasi.)
1 Sedihnya, strace
khusus untuk Linux. Sebagian besar Unix modern memiliki beberapa perintah yang melakukan hal serupa, tetapi sering memiliki nama yang berbeda, mungkin tidak memecahkan kode syscall argumen secara menyeluruh, dan kadang-kadang hanya berfungsi untuk root.
yes | tee >(true) >/dev/null
akan melakukan apa yang Anda harapkan, btw, seperti yangtee
berlanjut sampai semua penulis mati, sehinggatrue
keluar tidak akan mengganggu sepenuhnya.