Berikut adalah beberapa opsi yang saya pikirkan, tidak yakin mana yang benar.
- Ada kesalahan I / O membaca dari pipa.
- Proses penulisan ke ujung pipa yang lain mati dengan kegagalan.
- Semua proses yang bisa menulis ke pipa telah menutupnya.
- Buffer tulis dari pipa sudah penuh.
- Rekan telah menutup arah lain dari pipa dupleks.
- Penulisan gagal karena tidak ada proses yang dapat membaca dari pipa.
- Panggilan sistem mengembalikan kesalahan EPIPE, dan tidak ada penangan kesalahan yang diinstal.
Jawaban:
Suatu proses menerima SIGPIPE ketika mencoba untuk menulis ke pipa (bernama atau tidak) atau soket tipe SOCK_STREAM yang tidak memiliki pembaca tersisa.
Itu umumnya perilaku yang diinginkan. Contoh khas adalah:
Anda tidak ingin
find
terus berjalan setelahhead
diakhiri (dan kemudian tutup satu-satunya deskriptor file yang terbuka untuk dibaca pada pipa itu).The
yes
perintah biasanya bergantung pada sinyal untuk mengakhiri.Akan menulis "y" sampai beberapa perintah berakhir.
Perhatikan bahwa bukan hanya ketika perintah keluar, itu ketika semua pembaca telah menutup bacaan fd ke pipa. Di:
Akan ada 1 (subkulit), kemudian 2 (subkulit + tidur), lalu 1 (subkulit) lalu 0 fd membaca dari pipa setelah subkulit secara eksplisit menutup stdinnya, dan saat itulah
yes
akan menerima SIGPIPE.Di atas, sebagian besar cangkang menggunakan
pipe(2)
sementaraksh93
menggunakan asocketpair(2)
, tetapi perilakunya sama dalam hal itu.Ketika proses mengabaikan SIGPIPE, panggilan sistem penulisan (umumnya
write
, tapi bisapwrite
,send
,splice
...) kembali denganEPIPE
kesalahan. Jadi proses yang ingin menangani pipa yang rusak secara manual biasanya akan mengabaikan SIGPIPE dan mengambil tindakan atas kesalahan EPIPE.sumber
(6)
Meskipun kecuali jika Anda menduplikasi deskriptor dan fork, hanya ada satu proses untuk memulainya: umumnya sebuah pipa memiliki satu pembaca dan satu penulis, dan ketika salah satu dari mereka menutup koneksi, pipa tersebut tidak berfungsi. Jika Anda menggunakan pipa bernama, Anda dapat membuat beberapa koneksi (secara serial) dengannya, tetapi masing-masing mewakili pipa baru dalam pengertian ini. Jadi "pipa" ke utas atau proses identik dengan deskriptor file.
Dari
man 7 pipe
:Jadi "pipa yang putus" bagi penulis sama seperti EOF bagi pembaca.
sumber
Pipa yang rusak terjadi ketika proses membaca keluar sebelum proses penulisan. Jadi saya akan pergi dengan (6)
sumber