Apa itu pipa bernama

Jawaban:

153

Baik pada sistem Windows dan POSIX, pipa bernama menyediakan cara untuk komunikasi antar-proses terjadi di antara proses yang berjalan pada mesin yang sama. Apa yang diberi nama pipa kepada Anda adalah cara untuk mengirim data Anda tanpa memiliki penalti kinerja karena melibatkan tumpukan jaringan.

Sama seperti Anda memiliki server mendengarkan alamat IP / port untuk permintaan masuk, server juga dapat mengatur pipa bernama yang dapat mendengarkan permintaan. Dalam kedua kasus, proses klien (atau pustaka akses DB) harus mengetahui alamat spesifik (atau nama pipa) untuk mengirim permintaan. Seringkali, standar standar yang umum digunakan ada (seperti port 80 untuk HTTP, SQL server menggunakan port 1433 di TCP / IP; \\. \ Pipe \ sql \ query untuk pipa bernama).

Dengan menyiapkan pipa bernama tambahan, Anda dapat menjalankan beberapa server DB, masing-masing dengan pendengar permintaannya sendiri.

Keuntungan dari pipa bernama adalah biasanya lebih cepat, dan membebaskan sumber daya tumpukan jaringan.

- BTW, di dunia Windows, Anda juga bisa menamai pipa ke mesin jarak jauh - tetapi dalam kasus itu, pipa bernama diangkut melalui TCP / IP, sehingga Anda akan kehilangan kinerja. Gunakan pipa bernama untuk komunikasi mesin lokal.

Toybuilder
sumber
1
Apa kerugiannya?
lindhe
2
@lindhe Tidak ada operabilitas otomatis di seluruh jaringan. Umumnya lebih sulit diatur dalam praktek. Implementasi yang berbeda di Windows daripada di sistem Unix / Unix-like. Mereka keren, tapi saya tidak akan repot kecuali kinerja adalah suatu keharusan.
sudo
43

Unix dan Windows keduanya memiliki hal-hal yang disebut "Named pipes", tetapi mereka berperilaku berbeda. Di Unix, pipa bernama adalah jalan satu arah yang biasanya hanya memiliki satu pembaca dan satu penulis - penulis menulis, dan pembaca membaca, Anda mengerti?

Pada Windows, benda yang disebut "Named pipe" adalah objek IPC lebih mirip soket TCP - benda dapat mengalir dua arah dan ada beberapa metadata (Anda dapat memperoleh kredensial benda itu di ujung yang lain, dll).

Pipa bernama Unix muncul sebagai file khusus di sistem file dan dapat diakses dengan perintah IO file normal termasuk shell. Yang Windows tidak, dan perlu dibuka dengan system call khusus (setelah itu mereka berperilaku seperti win32 normal).

Yang lebih membingungkan, Unix memiliki sesuatu yang disebut "soket Unix" atau soket AF_UNIX, yang berfungsi lebih seperti (tetapi tidak sepenuhnya suka) "win32" bernama pipa ", yang dua arah.

MarkR
sumber
23

Linux Pipes
First In First Out (FIFO) mekanisme komunikasi antarproses.

Pipa Tanpa Nama
Di baris perintah, diwakili oleh "|" antara dua perintah.

Named Pipes
File khusus FIFO. Setelah dibuat, Anda dapat menggunakan pipa seperti file normal (buka, tutup, tulis, baca, dll).

Untuk membuat pipa bernama, disebut "myPipe", dari baris perintah ( halaman manual ):

mkfifo myPipe  

Untuk membuat pipa bernama dari c, di mana "pathname" adalah nama yang Anda ingin memiliki pipa dan "mode" berisi izin yang Anda ingin memiliki pipa ( halaman manual ):

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
John Mulder
sumber
2
"Anda dapat menggunakan pipa seperti file normal" - tidak sepenuhnya benar. Anda tidak dapat tell()posisi atau seek()dalam pipa.
nyov
19

Menurut Wikipedia :

[...] Pipa tradisional "tidak bernama" karena ada secara anonim dan tetap hanya selama proses tersebut berjalan. Pipa bernama adalah sistem-persisten dan ada di luar umur proses dan harus "dihapus tautannya" atau dihapus setelah tidak lagi digunakan. Proses umumnya melampirkan ke pipa bernama (biasanya muncul sebagai file) untuk melakukan IPC (komunikasi antar-proses).

Jonathan Lonowski
sumber
12

Membandingkan

echo "test" | wc

untuk

mkdnod apipe p
wc apipe

wc akan memblokir sampai

echo "test" > apipe

dieksekusi

John Nilsson
sumber
7

Pipa adalah cara streaming data antar aplikasi. Di Linux saya menggunakan ini setiap saat untuk mengalirkan output dari satu proses ke proses lainnya. Ini anonim karena aplikasi tujuan tidak tahu dari mana input-stream itu berasal. Tidak perlu.

Sebuah bernama pipa adalah hanya cara aktif mengaitkan ke sebuah pipa yang ada dan hoovering-up data. Ini untuk situasi di mana penyedia tidak tahu klien apa yang akan memakan data.

Oli
sumber
6

Ini adalah kutipan dari Technet (jadi tidak yakin mengapa jawaban yang ditandai mengatakan pipa bernama lebih cepat ??):

Bernama Pipa vs. Soket TCP / IP

Dalam lingkungan jaringan area lokal (LAN) yang cepat, Soket Kontrol Transmisi / Protokol Internet (TCP / IP) dan Pipa Bernama, klien dapat dibandingkan dalam hal kinerja. Namun, perbedaan kinerja antara TCP / IP Sockets dan Named Pipes klien menjadi jelas dengan jaringan yang lebih lambat, seperti lintas jaringan area luas (WAN) atau jaringan dial-up. Ini karena perbedaan cara mekanisme komunikasi antarproses (IPC) berkomunikasi antar teman.

Untuk pipa bernama, komunikasi jaringan biasanya lebih interaktif. Rekan tidak mengirim data sampai rekan lain memintanya menggunakan perintah baca. Pembacaan jaringan biasanya melibatkan serangkaian pesan pipa bernama mengintip sebelum mulai membaca data. Ini bisa sangat mahal dalam jaringan yang lambat dan menyebabkan lalu lintas jaringan yang berlebihan , yang pada gilirannya mempengaruhi klien jaringan lainnya.

Penting juga untuk mengklarifikasi jika Anda berbicara tentang pipa lokal atau pipa jaringan. Jika aplikasi server berjalan secara lokal di komputer yang menjalankan turunan dari SQL Server, protokol Pipa Bernama lokal adalah sebuah opsi. Pipa bernama lokal berjalan dalam mode kernel dan sangat cepat.

Untuk Soket TCP / IP, transmisi data lebih ramping dan memiliki overhead yang lebih sedikit. Transmisi data juga dapat memanfaatkan mekanisme peningkatan kinerja TCP / IP Sockets seperti windowing, keterlambatan ucapan terima kasih, dan sebagainya. Ini bisa sangat membantu dalam jaringan yang lambat. Tergantung pada jenis aplikasi, perbedaan kinerja tersebut dapat menjadi signifikan.

Soket TCP / IP juga mendukung antrian backlog. Ini dapat memberikan efek smoothing terbatas dibandingkan dengan pipa bernama yang dapat menyebabkan kesalahan pipa-sibuk ketika Anda mencoba untuk terhubung ke SQL Server.

Umumnya, TCP / IP lebih disukai dalam jaringan LAN, WAN, atau dial-up yang lambat, sedangkan pipa bernama dapat menjadi pilihan yang lebih baik ketika kecepatan jaringan tidak menjadi masalah, karena ia menawarkan lebih banyak fungsi, kemudahan penggunaan, dan opsi konfigurasi.

Ness
sumber
5

Komunikasi antar-proses (kebanyakan) untuk Aplikasi Windows. Mirip dengan menggunakan soket untuk berkomunikasi antara aplikasi di Unix.

MSDN

Ken
sumber
4
Pipa bernama muncul di V6 atau AT&T Unix sekitar tahun 1975.
dmckee --- ex-moderator kitten
Doh! Itu sedikit sebelum Microsoft. Sejauh yang saya tahu mereka tidak sering digunakan dalam aplikasi Unix / Linux. Benar?
Ken
Saya menggunakan pipa bernama untuk generator tanda tangan acak saya - karena aplikasi surat dan usenet mengharapkan file bernama $ HOME / .signature memiliki tanda tangan Anda, program saya membuat tanda tangan sebagai pipa bernama dan menulis kutipan acak untuknya.
Paul Tomblin
3

Named pipes dalam konteks unix / linux dapat digunakan untuk membuat dua shell yang berbeda untuk berkomunikasi karena shell tidak dapat berbagi apa pun dengan yang lain.

Selain itu, satu skrip yang dipakai dua kali dalam shell yang sama tidak dapat membagikan apa pun melalui dua instance. Saya menemukan penggunaan untuk pipa bernama ketika mengkode daemon yang berisi fungsi start () dan stop (), dan saya ingin menggunakan skrip yang sama untuk melakukan dua tindakan.

Tanpa pipa bernama (atau semaphore apa pun) memulai skrip di latar belakang tidak menjadi masalah. Masalahnya adalah ketika selesai Anda tidak bisa mengakses instance di latar belakang.

Jadi ketika Anda ingin mengirimnya perintah berhenti Anda tidak bisa: menjalankan skrip yang sama tanpa nama pipa dan memanggil fungsi stop () tidak akan melakukan apa-apa karena Anda benar-benar menjalankan contoh lain.

Solusinya adalah mengimplementasikan dua pipa, satu BACA dan yang lainnya MENULIS ketika Anda memulai daemon. Kemudian buat dia, di antara tugas-tugasnya yang lain, mendengarkan pipa BACA. Kemudian fungsi Stop () berisi perintah yang akan menulis pesan di dalam pipa, yang akan ditangani oleh skrip berjalan latar belakang yang akan melakukan jalan keluar 0. Dengan cara ini, skrip kedua dari skrip yang sama hanya bertugas melakukan: beri tahu contoh pertama untuk berhenti.

Dengan cara ini, satu dan hanya satu skrip dapat memulai dan menghentikannya sendiri.

Tentu saja Anda memiliki cara berbeda untuk melakukannya dengan memicu stop via sentuhan misalnya. Tapi yang ini bagus dan menarik untuk dikodekan.

Nicolas Mas
sumber
1

Named pipes adalah sistem windows untuk komunikasi antar-proses. Dalam kasus SQL server, jika server berada di mesin yang sama dengan klien, maka dimungkinkan untuk menggunakan pipa bernama untuk mengirim data, sebagai lawan dari TCP / IP.

eulerfx
sumber
Ini bukan Windows saja, karena jawaban Anda membuatnya muncul. Seperti orang lain telah mencatat, pipa bernama telah ada sejak tahun 70-an di UNIX, umumnya dengan penampilan sebagai file khusus. Tetap terpilih, tetapi perbaiki jawaban Anda.
Chris Charabaruk