Apa keuntungan menggunakan pipa bernama dibandingkan pipa tanpa nama?

51

Saya meninjau serangkaian pertanyaan wawancara yang diminta dari admin unix; Saya menemukan topik yang disebut "pipa bernama".

Saya mencari di Google topik; sampai batas tertentu saya sudah bisa memahaminya: - bernama pipa || FIFO

Tetapi saya masih merasa bahwa saya tidak memiliki pengetahuan kapan harus menggunakan jenis pipa khusus ini. Apakah ada situasi khusus di mana pipa yang tidak disebutkan namanya akan gagal berfungsi?

Ankit
sumber

Jawaban:

39

Named pipes (fifo) memiliki empat tiga kelebihan yang dapat saya pikirkan:

  • Anda tidak harus memulai proses membaca / menulis pada saat yang bersamaan
  • Anda dapat memiliki banyak pembaca / penulis yang tidak memerlukan keturunan yang sama
  • sebagai file, Anda dapat mengontrol kepemilikan dan izin
  • mereka dua arah, pipa yang tidak disebutkan namanya mungkin searah *

    *) Pikirkan shell standar |pipa yang searah, beberapa kerang ( ksh, zsh, dan bash) juga menawarkan coprocesses yang memungkinkan komunikasi dua arah. POSIX memperlakukan pipa sebagai setengah dupleks (yaitu masing-masing pihak hanya dapat membaca atau menulis), pipe()panggilan sistem mengembalikan dua pegangan file dan Anda mungkin diminta untuk memperlakukan satu sebagai hanya-baca dan yang lainnya hanya sebagai tulis-saja. Beberapa sistem (BSD) mendukung membaca dan menulis secara bersamaan (tidak dilarang oleh POSIX), pada yang lain Anda membutuhkan dua pipa, satu untuk setiap arah. Periksa halaman manual Anda pipe(), popen()dan mungkin popen2(). Undirectionality mungkin tidak tergantung pada apakah pipa dinamai atau tidak, meskipun pada Linux 2.6 itu tergantung.

(Diperbarui, terima kasih atas umpan balik dari Stephane Chazelas )

Jadi satu tugas segera yang jelas tidak dapat Anda capai dengan pipa tanpa nama adalah aplikasi klien / server konvensional.

Poin terakhir (terpukul) di atas tentang pipa searah relevan di Linux, POSIX (lihat popen()) mengatakan bahwa pipa hanya perlu dibaca atau ditulisi , di Linux searah . Lihat Memahami Kernel Linux (3rd Ed. O'Reilly) untuk perincian spesifik Linux (p787). Pipa penawaran dua arah OS lainnya (tanpa nama).

Sebagai contoh, Nagios menggunakan fifo untuk file perintahnya . Berbagai proses eksternal (skrip CGI, pemeriksaan eksternal, NRPE dll) menulis perintah / pembaruan untuk fifo ini dan ini diproses oleh proses Nagios yang persisten.

Pipa yang dinamai memiliki fitur yang tidak seperti koneksi TCP, tetapi ada perbedaan penting. Karena fifo memiliki nama sistem file persisten yang dapat Anda tulis padanya meskipun tidak ada pembaca, diakui penulisan akan memblokir (tanpa I / O async atau non-blocking), meskipun Anda tidak akan kehilangan data jika penerima tidak dimulai (atau sedang dimulai ulang).

Untuk referensi, lihat juga soket domain Unix , dan jawaban untuk pertanyaan Stackoverflow ini yang merangkum metode IPC utama , dan ini yang membahas tentangpopen()

mr.spuratic
sumber
2
Anda dapat memiliki banyak pembaca / penulis dengan pipa yang tidak disebutkan namanya juga. Di Linux, mereka tidak lebih bi-directional daripada pipa unamed. Ada akhir penulisan dan akhir membaca dan data mengalir dalam satu arah saja. Ketika Anda membuka fifo dalam mode tulis, Anda mendapatkan akhir tulisan, dalam mode baca ujung membaca, dalam mode rw, Anda menulis ke ujung penulisan dan membaca dari membaca. Itu berbeda dari pipa dua arah atau soket domain unix, di mana Anda sebenarnya memiliki dua aliran data terpisah di setiap arah.
Stéphane Chazelas
@StephaneChazelas terima kasih atas umpan baliknya, saya telah memperbarui jawabannya menjadi lebih spesifik, dan mengklarifikasi (saya harap) pipa dan directionality.
mr.spuratic
Apakah komunikasi ke pipa bernama melibatkan disk IO? Atau semuanya ada di memori? Apa yang menentukan amplop kinerja mekanisme IPC ini?
CMCDragonkai
15

Pipa yang tidak disebutkan namanya atau anonim menyediakan sarana komunikasi satu arah ke satu, proses satu arah antara berbagai proses yang terkait oleh hubungan orang tua-anak, atau dengan menjadi anak-anak dari orang tua biasa yang menyediakan pipa, seperti shell proses. Karena proses terkait, asosiasi deskriptor file ke pipa bisa implisit dan tidak memerlukan objek dengan nama yang eksternal untuk proses. Pipa yang tidak disebutkan namanya ada hanya selama proses yang menggunakannya mempertahankan deskriptor file terbuka ke pipa. Ketika proses keluar dan OS menutup semua deskriptor file yang terkait dengan proses, pipa yang tidak disebutkan namanya ditutup.

Pipa yang diberi nama sebenarnya adalah FIFO. Ini adalah objek persisten yang diwakili oleh node dalam sistem file. Pipa bernama menyediakan banyak-ke-banyak, komunikasi dua arah antara satu atau lebih proses yang tidak selalu terkait dan tidak perlu ada pada saat yang sama. Nama file pipa berfungsi sebagai alamat atau kontrak antara proses komunikasi. Jika hanya satu proses menulis ke pipa bernama dan satu proses lain membaca dari pipa bernama, maka pipa bernama berperilaku dengan cara yang sama dengan pipa tanpa nama antara dua proses terkait.

Jadi jawaban singkatnya adalah bahwa Anda memerlukan pipa bernama untuk komunikasi antara proses yang tidak terkait yang mungkin tidak ada pada saat yang sama.

Jonathan Ben-Avraham
sumber
+1 Saya pikir prosesnya cukup banyak selalu ada pada saat yang sama (jika tidak, pipanya sedikit tidak berguna - Anda mungkin juga meninggalkan barang-barang di file biasa). Soket domain unix dan ini sering digunakan oleh layanan daemon yang dapat dikontrol, misalnya, dari baris perintah. Jika Anda mencari di /runsistem desktop linux Anda mungkin akan menemukan beberapa dari keduanya (bernama fifos dan unix sockets). Ini bentuk IPC .
goldilocks
2
@goldilocks: Pipa bernama biasanya digunakan sebagai kotak surat ad-hoc residen-memori antara proses dalam sistem tertanam, di mana proses komunikasi berumur pendek dan tidak ada pada saat yang sama. Keuntungannya adalah kesederhanaan implementasi versus memori bersama IPC dan fakta bahwa hanya RAM yang digunakan. Kerugiannya adalah tidak adanya persistensi antara sepatu bot dan sifat FIFO byte-bijaksana dari pipa versus kemampuan untuk menggunakan struktur dengan memori bersama.
Jonathan Ben-Avraham
@jonathan: +1, saya ragu: - mengapa kita menyebut pipa bernama FIFO; apa objek yang tahan?
Ankit
@Ankit: Beberapa orang menyebut pipa bernama FIFO karena berperilaku seperti struktur data FIFO, terutama ketika dibuka untuk membaca dan menulis dengan satu proses. Dengan "objek persisten" Maksud saya pipa bernama dikaitkan dengan objek sistem file. Yaitu, ini adalah jenis file, dengan nama, dan memiliki ketekunan yang sama dengan file lain yang disimpan di media.
Jonathan Ben-Avraham
4

Satu keuntungan yang tidak disebutkan di tempat lain adalah bahwa pipa bernama dapat digunakan di tempat-tempat di mana hanya file yang akan dilakukan.

Sebagai contoh, beberapa klien email memiliki fitur menambahkan konten tanda ~ /. Ke setiap pesan email. Jika .signature adalah opsi baris perintah atau jika klien email dapat melihat bahwa .signature dapat dieksekusi dan menjalankannya, maka Anda tidak memerlukan pipa bernama. Tetapi jika klien email tidak secanggih itu, Anda bisa membuat pipa bernama bernama .signature dan menjalankan aplikasi yang menghasilkan tanda tangan baru setiap kali file dibaca.

Eyal
sumber
Menarik. Apakah Anda memiliki aplikasi seperti itu? Tampaknya ia harus menonton di tingkat kernel untuk melihat kapan FIFO diakses.
Wildcard
4

Ada keuntungan lain dari pipa bernama: Anda dapat menggunakannya di berbagai sistem . Misalkan Anda menginginkan komunikasi real-time dari dua proses yang berjalan pada mesin yang berbeda. Kemudian bagikan folder di antara keduanya, letakkan FIFO Anda ke folder, dan pergilah. Ini jauh lebih mudah daripada mengubah aplikasi yang dirancang untuk bekerja pada file menjadi layanan mendengarkan pada port.

MariusMatutiae
sumber