Apakah file soket Internet Unix?


23

Saya mengerti bahwa "Semuanya adalah file" adalah salah satu konsep utama Unix, tetapi soket menggunakan API berbeda yang disediakan oleh kernel (seperti socket, sendto, recv, dll.), Tidak seperti antarmuka sistem file normal.

Bagaimana ini "Semuanya adalah file" berlaku di sini?

Jawaban:


26

soket menggunakan API yang berbeda

Itu tidak sepenuhnya benar. Ada beberapa fungsi tambahan untuk digunakan dengan soket, tetapi Anda dapat menggunakan, misalnya, normal read()dan write()pada soket fd.

bagaimana ini "Semuanya adalah file" berlaku di sini?

Dalam arti bahwa deskriptor file terlibat.

Jika definisi Anda tentang "file" adalah urutan byte yang disimpan dalam sistem file, maka tidak semua file. Namun, jika definisi file Anda lebih seperti menangani - saluran untuk informasi, yaitu koneksi I / O - maka "semuanya adalah file" mulai lebih masuk akal. Hal-hal ini pasti melibatkan urutan byte, tetapi dari mana mereka berasal atau pergi mungkin berbeda secara kontekstual.

Namun, itu tidak dimaksudkan secara harfiah. Sebuah daemon tidak file, daemon adalah proses; tetapi jika Anda melakukan IPC metode Anda berhubungan dengan proses lain mungkin dikurangi oleh entitas gaya file.


5
Saya akan mengatakan pengulangan akurat "semuanya adalah file" harus "semua antarmuka melalui file". Anda berinteraksi dengan proses melalui file (stdin / out / err, / proc / $ pid, dll). Anda berinteraksi dengan jaringan melalui file (soket / deskriptor file). Anda berinteraksi dengan mouse melalui file (/ dev / mouse).
Patrick

Saya pernah mengkloning gagang soket dengan membukanya dari / proc.
Yosua

12

"Semuanya adalah file" hanyalah pernyataan berlebihan. Ini adalah novel dalam tahun 1970-an dan itu adalah karakteristik yang membedakan utama UNIX. Tapi itu hanya konsep pemasaran, bukan fondasi nyata UNIX, karena itu jelas tidak benar. Tidaklah bermanfaat atau masuk akal untuk memperlakukan SEMUA sebagai file.

Apakah CPU file? Apakah program Anda membaca () CPU untuk mendapatkan instruksi baru? Apakah RAM file? Apakah program Anda membaca () byte berikutnya?

Saat itu, ada beberapa jenis OS yang memberi Anda satu API untuk floppy disk dan API berbeda untuk hard disk, API berbeda untuk pita magnetik, dan sekelompok API berbeda untuk terminal berbeda dan seterusnya. Sistem mainframe IBM memiliki berbagai jenis file pada hard disk dan memberi Anda API yang berbeda untuk masing-masingnya, percaya atau tidak! Jadi UNIX "itu adalah file" pendekatan, bersama dengan pendekatan "stdin / stdout / stderr", membawa abstraksi yang sangat elegan bagi pengguna dan pemrogram.

Dengan jaringan, abstraksi khusus ini tidak berhasil. Dan tidak ada salahnya, hanya sedikit keseluruhan keanggunan dan koherensi OS. Tapi itu berhasil. Apakah Anda melihat file yang dipanggil di /dev/myinternetz/www/google/com/tcp/80mana saja di sistem Anda hari ini? Bisakah Anda membuka (), menulis () kueri, dan membaca () jawabannya dalam HTML yang bagus? Tidak? Ini karena abstraksi "is a file" ini tidak terlalu berguna untuk berinteraksi di sekitar jaringan. Itu tidak akan bekerja terlalu baik dalam latihan. Hukum abstraksi bocor dalam tindakan.


9
Fakta menyenangkan: beberapa versi bash akan memungkinkan Anda untuk membuka /dev/tcp/www.google.com/80. Ini bukan file yang sebenarnya - bash hanya memalsukannya.
user253751

2
@immibs: Lebih penting lagi, mungkin saja membuat sistem file yang benar-benar mengimplementasikannya.
Yosua

Saya kira Anda bisa membaca /dev/mematau /dev/kmemjika Anda mau.
Jason C

4
Perhatikan bahwa rencana 9 mengambil langkah ini lebih jauh dan memang, protokol jaringan ditangani melalui sistem file semu dengan efek dari contoh / dev / myinternetz / www / google / com / tcp / 80 Anda (dengan jalur yang berbeda tentu saja). Selain itu, ram fisik benar-benar berfungsi seperti file, Anda dapat memasukkan ruang alamat virtual Anda seperti halnya Anda memasukkan file ke dalamnya. (Malloc diterapkan pada ide ini).
Vality

1
Rencana 9 mengambil "semuanya adalah file" ke ekstrem di samping dengan "semuanya transparan jaringan" memiliki beberapa implikasi yang cukup kuat. Misalnya, tidak perlu untuk NAT, Anda bisa memasang stack TCP / IP router Anda (yang hanya berupa file transparan-sistem (sistem)) pada mesin lokal Anda dan mengirim paket langsung dari router Anda.
Jörg W Mittag

7

Soket adalah file. Anda dapat menggunakan readdan writepada soket: mereka setara dengan menelepon recvdan senddengan flags=0. Anda menutupnya dengan close. Anda dapat memindahkan mereka dupdan teman-teman jika Anda perlu mengacak file deskriptor. Anda dapat mengatur beberapa flag dengan fcntl, dan menggunakan buffering stdio setelah menelepon fdopen. Daftarnya berlanjut. Sangat penting, Anda dapat memanggil selectdan pollpada jenis file apa pun, termasuk soket, sehingga fungsi-fungsi ini memungkinkan program untuk memblokir hingga menerima input melalui cara apa pun hanya dengan mendaftar deskriptor file.

Ada sistem panggilan tambahan untuk beberapa jenis socket ( recvdan send, shutdown, dll), seperti ada sebuah system call tambahan untuk perangkat ( ioctl).

Tidak semua file memiliki nama , dan dari mereka yang melakukannya, mereka tidak selalu hidup dalam struktur direktori. Pipa dibuat oleh pipe(misalnya dalam pipa shell) dan soket yang dibuat oleh socketpairtidak memiliki nama, tetapi mereka masih file. Soket yang dibuat oleh socketmemiliki nama yang sintaks tergantung pada domain. Nama ini diteruskan struct sockaddrke binddan fungsi lainnya. Untuk AF_UNIXsoket Unix ( ), namanya adalah a struct sockaddr_un, yang merupakan keluarga dan string; tergantung pada string, ini bisa berupa nama file (soket bernama dapat dibuat dengan mknodbanyak varian unix) atau tidak (namespace abstrak). Untuk AF_INETsoket IPv4 ( ), namanya adalah a struct sockaddr_in, berisi nomor port dan alamat IP, ditambah protocoldari socketpanggilan.


7

Jika Anda statseorang socket, Anda akan melihat bahwa ia memiliki nomor inode dan karakteristik lain dari file biasa, jadi saya akan mengklasifikasikannya sebagai file pada sistem file. Contoh:

# file live
live: socket
# stat live
File: `live'
  Size: 0               Blocks: 0          IO Block: 4096   socket
Device: fc03h/64515d    Inode: 198817      Links: 1
Access: (0660/srw-rw----)  Uid: (23129/  icinga)   Gid: (23130/icinga-cmd)
Access: 2014-11-07 09:27:59.000000000 -0800
Modify: 2014-11-05 09:27:03.000000000 -0800
Change: 2014-11-05 09:27:03.000000000 -0800

11/17. Informasi tambahan untuk Linux (ext3): Soket memiliki inode (yang merupakan blok 256-byte pada disk) tetapi tidak memiliki blok data apa pun (Anda dapat memverifikasi ini dengan mengekstrak inode dan memeriksa pointer blok data; atau dengan menjalankan 'stat' debugfs yang menunjukkan Blockcount dari 0). Jadi, ia memiliki metadata file (pemilik, grup, izin, dll) tetapi tidak ada konten data pada disk. Ini identik dengan file kosong biasa ( touch /tmp/foo) yang juga memiliki jumlah blok 0. Dalam kasus pertama, bidang "tipe" di inode menunjukkan "socket"; dalam kasus kedua ini menunjukkan "file biasa."

Referensi: struktur inode ext2 ; stat,, dumpe2fsdan debugfsperintah.


1
Saya akan mengatakan hanya memiliki sesuatu untuk dijalankan fileatau statmembuatnya menjadi file.
Kevin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.