Saya mendapatkan error "broken pipe" dari Xcode satu kali terlalu banyak. Saya sekarang penasaran ingin tahu persis apa itu pipa.
Apa konsep "pipa" dan bagaimana bisa "rusak"?
Saya mendapatkan error "broken pipe" dari Xcode satu kali terlalu banyak. Saya sekarang penasaran ingin tahu persis apa itu pipa.
Apa konsep "pipa" dan bagaimana bisa "rusak"?
Jawaban:
Pipa hanyalah mekanisme komunikasi antarproses (IPC) yang digunakan untuk menghubungkan output standar dari satu proses ke input standar yang lain.
Contohnya adalah ketika Anda ingin mencari file untuk kata "pax":
cat filename | grep pax
dan ya, saya tahu Anda dapat grep
file secara langsung tetapi itu tidak menjelaskan cara kerjanya, bukan?
Ini menghubungkan output standar dari cat
perintah ke input standar dari grep
perintah. cat
mengirimkan konten file ke output standarnya, dan grep
membaca file-nya (dalam hal ini) dari input standarnya. Dengan menghubungkan proses bersama-sama seperti ini, Anda dapat membuat alat Anda sendiri yang terdiri atas sejumlah segmen pipa. Hal-hal seperti:
show_users | grep pax | awk -F: '{print $4}' | tr '[a-z]' '[A-Z]' | cut -c1-20
Sebuah rusak pipa adalah salah satu di mana (biasanya) penerima data telah menutup sambungan sementara pengirim masih berusaha untuk mengirim barang melalui.
Misalnya, jika Anda mengirim file besar melalui program pager (untuk melihatnya satu halaman sekaligus):
cat myfile | pager
dan kemudian lakukan CTRL-BREAK, ini dapat menyebabkan pager
proses mematikan pipa inputnya sebelum cat
selesai menggunakannya. Itu salah satu kemungkinan untuk mendapatkan pipa yang rusak ini.
Dari pencarian Google sepintas , masalah khusus ini tampaknya terkait dengan penyebaran ad hoc dan solusi yang diberikan biasanya termasuk keluar dari sebagian besar perangkat lunak Anda dan me-reboot sebagian besar perangkat Anda.
Ini mungkin cukup serius untuk melaporkan masalah ini ke Apple. Semakin banyak pengembang yang mengeluhkannya, semakin besar kemungkinan sesuatu akan dilakukan untuk memperbaikinya.
pr -e4 -n ten-thousand-lines.c | sed 10q
berakhir dengan pipa yang rusak. Apakah pr
mengganggu untuk memberi tahu Anda bahwa sinyal SIGPIPE didapat adalah masalah lain; mungkin hanya keluar sebagai hasil dari sinyal (menghasilkan status keluar yang tidak nol).
The |
karakter sering disebut pipa. Dalam berbagai shell UNIX (yang saya tahu) dapat digunakan untuk menyalurkan output dari satu perintah ke input yang lain.
cat myfile.txt | head
The head
perintah hanya menunjukkan beberapa baris pertama dari input. Pada saat itu, ia menutup inputnya. Ini menimbulkan masalah bagi perintah yang menghasilkan input. Di mana ia menulis? Setiap kali kita memiliki situasi ini, atau situasi ketika proses penulisan berakhir sebelum pembaca selesai, itu disebut "pipa patah".
Untuk mencegah cat
perintah tertinggal selamanya, standar UNIX mendefinisikan sinyal khusus ( SIGPIPE , sinyal 13 ) yang dikirimnyacat
. Tindakan default untuk sinyal ini adalah mematikan proses, yang membuat cat
akhir dengan baik.
Sepertinya aplikasi yang Anda gunakan telah memasang penangan sinyal untuk semua sinyal, termasuk SIGPIPE, yang menciptakan pesan sembulan kecil yang Anda lihat.
Kesalahan ini tampaknya cukup sering muncul. /programming/490366/ad-hoc-deployment-issue-putpkt-write-failed-broken-pipe it's "... kesalahan internal dalam kemampuan Xcode untuk berbicara dengan telepon Anda. Tidak berarti Anda telah melakukan kesalahan, itu adalah bug dalam sistem pengembangan "
Pipa adalah mekanisme IPC pada sistem Unix. Sebuah pipa memiliki dua ujung, ujung baca, dan ujung tulis. Data yang ditulis ke dalam akhir penulisan dapat dibaca dari akhir baca dan keluar dalam urutan yang ditulis.
Di dunia baris perintah Unix, pipa adalah cara yang sangat umum untuk menghubungkan program bersama untuk menyelesaikan pekerjaan. Misalnya sed 's/foo/bar/g' fred.txt | grep -e 'bar.*baz'
akan membaca di file fred.txt
ganti semua instance dari string foo
dengan string bar
kemudian cari hasilnya untuk baris yang berisi bar
diikuti oleh sejumlah karakter, lalu baz
.
Tentu saja itu tidak terlalu berguna. Tetapi saya yakin jika Anda memikirkannya, Anda dapat melihat bagaimana Anda dapat menggunakannya untuk semua jenis penggunaan yang menarik, terutama sekali Anda memiliki program seperti awk
atau yang perl
Anda inginkan.
Sistem pipa telah menjadi bagian dari Unix sejak awal. Dan jika suatu proses dalam pipa Anda keluar, Anda biasanya ingin semua program dalam pipa keluar. Ini berarti bahwa, secara default, proses yang menulis ke dalam pipa jika proses pada akhir baca hilang akan mendapatkan SIGPIPE
sinyal. Dan jika itu diblokir sinyal itu, write
masih akan gagal dengan jenis kesalahan khusus yang menunjukkan bahwa pipa telah 'rusak'.
Penanganan default SIGPIPE
membunuh proses yang menerimanya. Dan jika itu bukan 'kepala' dari pipa, SIGPIPE
semuanya menyebar kembali ke rantai.
Apa yang dikeluhkan Xcode adalah bahwa ia memulai beberapa sub-program untuk melakukan sesuatu dengan pipa yang mengarah ke sana, dan sub-program itu mati secara tak terduga sehingga pipa rusak ..
Pipa “patah” adalah salah satu ujungnya close()
dan yang lainnya sedang dibaca atau ditulis. Misalnya, dalam perintah shell berikut:
cat foo | less
The cat
Proses memegang akhir penulisan pipa, dan less
proses membaca salah satu. Jika proses pembaca menutup pipa, pipa rusak (dan karenanya tidak berguna); proses penulis akan menerima kesalahan "pipa rusak" dari sistem operasi.
cat
jelas akan segera setelah selesai), pembaca hanya akan melihat file akhir yang normal.