Apa itu "pipa" dan bagaimana bisa "rusak"?

12

masukkan deskripsi gambar di sini

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"?

Moshe
sumber
3
Pipa adalah tabung panjang yang menampung banyak data. Jika ujung penerima pipa berhenti menarik data keluar, ia mulai mundur dan pipa meledak. Komputer menginformasikan akhir yang memasukkan data ke dalam pipa bahwa ini telah terjadi.
Mahakuasa

Jawaban:

7

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 grepfile secara langsung tetapi itu tidak menjelaskan cara kerjanya, bukan?

Ini menghubungkan output standar dari catperintah ke input standar dari grepperintah. catmengirimkan konten file ke output standarnya, dan grepmembaca 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 pagerproses mematikan pipa inputnya sebelum catselesai 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.


sumber
Jadi apa itu pipa "pecah"?
Moshe
pr -e4 -n ten-thousand-lines.c | sed 10qberakhir dengan pipa yang rusak. Apakah prmengganggu untuk memberi tahu Anda bahwa sinyal SIGPIPE didapat adalah masalah lain; mungkin hanya keluar sebagai hasil dari sinyal (menghasilkan status keluar yang tidak nol).
Jonathan Leffler
Pipa tidak harus menghubungkan input dan output "standar". Secara program dimungkinkan untuk melewatkan I / O apa pun melalui pipa, meskipun dari baris perintah Anda benar.
CarlF
2

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 headperintah 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 catperintah tertinggal selamanya, standar UNIX mendefinisikan sinyal khusus ( SIGPIPE , sinyal 13 ) yang dikirimnyacat . Tindakan default untuk sinyal ini adalah mematikan proses, yang membuat catakhir dengan baik.

Sepertinya aplikasi yang Anda gunakan telah memasang penangan sinyal untuk semua sinyal, termasuk SIGPIPE, yang menciptakan pesan sembulan kecil yang Anda lihat.

bukzor
sumber
1

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.txtganti semua instance dari string foodengan string barkemudian cari hasilnya untuk baris yang berisi bardiikuti 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 awkatau yang perlAnda 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 SIGPIPEsinyal. Dan jika itu diblokir sinyal itu, writemasih akan gagal dengan jenis kesalahan khusus yang menunjukkan bahwa pipa telah 'rusak'.

Penanganan default SIGPIPEmembunuh proses yang menerimanya. Dan jika itu bukan 'kepala' dari pipa, SIGPIPEsemuanya 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 ..

Beraneka ragam
sumber
0

Pipa “patah” adalah salah satu ujungnya close()dan yang lainnya sedang dibaca atau ditulis. Misalnya, dalam perintah shell berikut:

cat foo | less

The catProses memegang akhir penulisan pipa, dan lessproses membaca salah satu. Jika proses pembaca menutup pipa, pipa rusak (dan karenanya tidak berguna); proses penulis akan menerima kesalahan "pipa rusak" dari sistem operasi.

Michael Trausch
sumber
1
Sebenarnya, itu hanya "rusak" jika pembaca menutupnya. Jika penulis menutupnya ( catjelas akan segera setelah selesai), pembaca hanya akan melihat file akhir yang normal.
Random832
Ups, Anda benar sekali ... Saya akan memperbarui jawaban saya.
Michael Trausch