Apakah ada file untuk setiap soket?

21

"Semuanya adalah file" di Dunia UNIX.

Kalimat di atas terkenal. Ketika saya berlari echo "hello programmer" >> /dev/tty1, saya bisa menonton string yang diberikan TeleType 1 , ....

Apa dan di mana file per masing-masing socket? Misalkan teman saya terhubung ke PC saya, dan IP-nya adalah h.h.h.h, bagaimana saya bisa mengakses file masing-masing? Apa itu mungkin?

Teluk Persia
sumber
3
Socket API sebenarnya merupakan penyimpangan dari "kebijakan Unix" dalam hal ini, karena aslinya berasal dari BSD . Perhatikan bahwa selalu ada Plan 9 dari Bell Labs yang "lebih banyak Unix daripada Unix" - bahkan jaringan dan grafik API adalah file di sana.
ntoskrnl
soket dan proses disebutkan dalam jumlah yang cukup di kertas Plan 9, sebagian besar berbicara tentang kesalahan model UNIX.
strugee

Jawaban:

9

man 7 unix:

Kelompok soket AF_UNIX (juga dikenal sebagai AF_LOCAL) digunakan untuk berkomunikasi antar proses pada mesin yang sama secara efisien. Secara tradisional, soket domain UNIX dapat berupa tidak bernama, atau terikat pada pathname sistem file (ditandai sebagai soket tipe). Linux juga mendukung namespace abstrak yang tidak tergantung pada sistem file.

Yaitu tidak setiap soket dapat dilihat sebagai file (dalam arti "tidak ada file tanpa nama file").

Tetapi ada file dengan daftar soket (misalnya /proc/net/tcp); tidak persis apa artinya "semuanya file".

Hauke ​​Laging
sumber
38

Soket adalah file. Tetapi tidak semua file memiliki nama. Berikut adalah beberapa contoh file yang tidak memiliki nama:

  • File apa pun yang dulu memiliki nama, dan sekarang dihapus, tetapi masih dibuka oleh suatu program.
  • Pipa yang tidak disebutkan namanya , seperti yang dibuat oleh |operator shell.
  • Kebanyakan soket : soket Internet apa pun , atau soket Unix yang tidak ada dalam ruang nama sistem berkas (bisa dalam ruang nama abstrak atau tidak disebutkan namanya).

File seperti pipa atau soket yang tidak disebutkan namanya dibuat oleh suatu proses dan hanya dapat diakses dalam proses itu atau dalam proses anak yang selanjutnya dibuat. (Ini tidak sepenuhnya benar: sebuah proses yang memiliki pipa atau soket (atau file lain) terbuka dapat mengirimkannya ke proses lain melalui soket Unix; ini dikenal sebagai file deskriptor yang lewat .)

Soket yang memiliki nama (apakah dalam sistem file atau abstrak) dapat dibuka menggunakan nama itu. Soket jaringan dapat dibuka (atau lebih tepatnya terhubung) dari jarak jauh dari mesin apa pun yang memiliki konektivitas yang sesuai.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ini jawaban yang benar.
jforberg
4
/proc/<pid>/fd/*dan /proc/net/*mungkin menarik
n611x007
Harap terima jawaban ini. Ini IMHO jauh lebih akurat.
user1202136
13

Apa dan di mana file per setiap socket?

"Segalanya" adalah berlebihan. Ini bukan kebijakan yang ketat, itu hanya praktik umum untuk menggunakan filesystem untuk antarmuka karena akses filesystem identik dengan panggilan sistem (yaitu, filesystem benar-benar antarmuka dengan kernel, dan karenanya memberikan format yang mudah untuk semua jenis hal) . Sistem operasi lain tidak menggunakan ini sebanyak mungkin, sehingga dianggap sebagai fitur yang membedakan.

Seperti Hauke ​​Laging menyebutkan, soket "unix local" memiliki simpul file seperti halnya pipa bernama (lihat man fifo). Namun, soket protokol internet (digunakan untuk komunikasi jaringan) tidak. Sebagai gantinya, mereka terkait di userspace dengan nomor port. Perhatikan bahwa soket server pada port tunggal menghubungkan beberapa klien masing-masing dengan soketnya masing-masing (satu file soket lokal unix juga dapat digunakan dengan cara ini dengan server, artinya, mungkin ada beberapa soket yang terkait dengan alamat file yang sama) dan dalam kode mereka sebenarnya diidentifikasi secara individual melalui deskriptor file numerik yang terpisah .

Jadi, dalam arti bahwa semua soket yang banyak seperti file, dan memiliki link di /proc/[pid]/fd/. Anda bahkan dapat memanggil readlink()inode ini dan mendapatkan semacam nama file khusus, yang digunakan dalam alat-alat baris perintah seperti lsof, saya percaya; Anda juga dapat memperoleh informasi tentang keterangan soket melalui fstat().

goldilocks
sumber
Maksud Anda "diidentifikasi di userspace oleh inode mereka"? Tidak setiap soket memiliki nomor port dan mungkin ada beberapa soket untuk nomor port yang sama (meskipun tidak masuk akal).
Hauke ​​Laging
@ HaukeLaging: Poin bagus. Saya telah mengedit untuk memperjelas ini dimulai dengan paragraf kedua.
goldilocks