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.
"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/80
mana 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.sumber
/dev/tcp/www.google.com/80
. Ini bukan file yang sebenarnya - bash hanya memalsukannya./dev/mem
atau/dev/kmem
jika Anda mau.Soket adalah file. Anda dapat menggunakan
read
danwrite
pada soket: mereka setara dengan meneleponrecv
dansend
denganflags=0
. Anda menutupnya denganclose
. Anda dapat memindahkan merekadup
dan teman-teman jika Anda perlu mengacak file deskriptor. Anda dapat mengatur beberapa flag denganfcntl
, dan menggunakan buffering stdio setelah meneleponfdopen
. Daftarnya berlanjut. Sangat penting, Anda dapat memanggilselect
danpoll
pada 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 (
recv
dansend
,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 olehsocketpair
tidak memiliki nama, tetapi mereka masih file. Soket yang dibuat olehsocket
memiliki nama yang sintaks tergantung pada domain. Nama ini diteruskanstruct sockaddr
kebind
dan fungsi lainnya. UntukAF_UNIX
soket Unix ( ), namanya adalah astruct sockaddr_un
, yang merupakan keluarga dan string; tergantung pada string, ini bisa berupa nama file (soket bernama dapat dibuat denganmknod
banyak varian unix) atau tidak (namespace abstrak). UntukAF_INET
soket IPv4 ( ), namanya adalah astruct sockaddr_in
, berisi nomor port dan alamat IP, ditambahprotocol
darisocket
panggilan.sumber
Jika Anda
stat
seorang 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: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
,,dumpe2fs
dandebugfs
perintah.sumber
file
ataustat
membuatnya menjadi file.