soket domain unix VS bernama pipa?

122

Setelah melihat soket bernama unix dan saya pikir itu dinamai pipa. Saya melihat pipa nama dan tidak melihat banyak perbedaan. Saya melihat mereka diinisialisasi secara berbeda tetapi itu satu-satunya hal yang saya perhatikan. Keduanya menggunakan fungsi C menulis / membaca dan bekerja sama seperti AFAIK.

Apa perbedaan antara soket domain unix dan pipa bernama? Kapan saya akan memilih satu dari yang lain? Mana yang harus saya gunakan secara default (seperti bagaimana saya menggunakan vektor secara default di C ++ daripada menggunakan deque, daftar atau apa pun jika saya punya kebutuhan)?


sumber
1
@GregHewgill: sayangnya pertanyaan itu lebih kepada "apa itu IPC" daripada perbedaan yang saya tanyakan: /. Saya memang melihat itu sebelum memposting, haruskah saya menautkan dan mengatakan itu terkait? (itu tidak membantu saya)
1
@acid: Ya, menghubungkan pertanyaan terkait dan menjelaskan pertanyaan apa yang masih Anda miliki selalu merupakan ide yang bagus.
Ben Voigt
3
Artikel ini merangkumnya dengan cukup baik. Demystifying Unix Domain Sockets: thomasstover.com/uds.html
Cong Ma
Tautan rusak: techdeviancy.com/uds.html
mcdado

Jawaban:

106

Soket domain UNIX umumnya lebih fleksibel daripada pipa bernama. Beberapa keunggulannya adalah:

  • Anda dapat menggunakannya untuk lebih dari dua proses komunikasi (misalnya, proses server dengan kemungkinan banyak proses klien yang terhubung);
  • Mereka dua arah;
  • Mereka mendukung penerusan kredensial UID / GID yang diverifikasi kernel di antara proses;
  • Mereka mendukung pendeskripsi file yang lewat di antara proses;
  • Mereka mendukung mode paket dan paket berurutan.

Untuk menggunakan banyak fitur ini, Anda perlu menggunakan send()/ recv()keluarga panggilan sistem daripada write()/ read().

kafe
sumber
11
Di sisi lain, mungkin harus dikatakan bahwa pipa nama memiliki keuntungan karena dapat "dihubungkan ke" melalui open(2)panggilan biasa , yang membuatnya lebih cocok untuk membangun jalur pipa ad-hoc antara program yang biasanya hanya menggunakan argumen nama file.
Dolda2000
66

Satu perbedaan adalah bahwa pipa bernama itu satu arah, jadi Anda harus menggunakan dua di antaranya untuk melakukan komunikasi dua arah. Soket tentu saja dua arah. Tampaknya sedikit lebih rumit untuk menggunakan dua variabel daripada satu (yaitu, dua pipa, bukan satu soket).

Juga, artikel wikipedia cukup jelas pada poin berikut : "Soket domain Unix dapat dibuat sebagai aliran byte atau sebagai urutan datagram, sedangkan pipa hanya aliran byte."


Pipa yang diberi nama sebenarnya adalah dua arah tetapi setengah dupleks . Ini berarti bahwa komunikasi dapat berpindah dari ujung A ke ujung B, atau B ke A, tetapi tidak pernah keduanya pada saat yang bersamaan.

jtoberon
sumber
1
hmm menarik +1. Apakah Anda secara kebetulan tahu apa perbedaan antara bytestream dan datagram? Mungkin contoh dalam satu atau dua kalimat seperti yang sudah Anda lakukan untuk pertanyaan ini?
7
@acidzombie: Soket atau pipa mode-datagram mempertahankan batas, sehingga satu writepanggilan menghasilkan satu readpanggilan. Dalam mode aliran, data dapat digabungkan menjadi satu aliran panjang, sehingga banyak tulisan dapat dibaca sekaligus, atau sebaliknya. (Windows memiliki pipa datagram, menurut jawaban jtoberon, Unix tidak)
Ben Voigt
1
@BenVoigt Baiklah, pengiriman paket soket datagram tidak dapat diandalkan, jadi penulisan tidak selalu menghasilkan panggilan baca. Mungkin untuk soket lokal, tetapi itu tidak jelas dari komentar Anda. Jadi terlepas dari itu ada masalah.
xaxxon
3
@xaxxon: Baik pipa dan soket domain unix bersifat lokal, jadi lossless adalah penerima mengosongkan antriannya sama sekali.
Ben Voigt
6
Ya, tidak seperti UDP, soket domain datagram Unix dijamin , pengiriman sesuai pesanan.
jtchitty