Saya butuh bantuan untuk memahami apa yang saya yakini sebagai konsep mendasar di Linux: batas untuk membuka file. Secara khusus, saya bingung mengapa soket terbuka dapat diperhitungkan dengan jumlah total "file terbuka" pada suatu sistem.
Dapatkah seseorang tolong uraikan alasannya? Saya mengerti bahwa ini mungkin kembali ke prinsip "semuanya adalah file" di Linux tetapi detail tambahan akan dihargai.
sumber
read
/write
antarmuka, yang merupakan jantung dari apa artinya menjadi file.shutdown(2)
syscall pada mereka, tetapi tidak pada file, dan Anda tidak dapat membaca dari soket menggunakancat
- itulah alasannyanetcat
telah dibuat. Saya akan mengatakan bahwa (untungnya) soket di kernel mirip Unix berperilaku seperti file dalam hal I / O, tetapi kesamaan berakhir di sana. (Jujur, saya juga ingin mendengar dari seseorang dengan pengalaman Plan 9 karena saya pernah mendengar mereka mendapatkan penyatuan hal-hal ini lebih jauh dari kesatuan tradisional).Alasan mengapa TCP / IP soket penggunaan deskriptor file adalah bahwa, ketika antarmuka soket pertama kali dirancang dan diimplementasikan ( di BSD Unix, pada tahun 1983 ), desainer merasa bahwa koneksi jaringan adalah analog dengan file - Anda bisa
read
,write
danclose
kedua , dan itu akan cocok dengan gagasan Unix "semuanya adalah file".Implementasi tumpukan jaringan TCP / IP lainnya tidak selalu berintegrasi dengan subsistem file-I / O OS mereka, contohnya adalah MacTCP . Tetapi karena antarmuka soket BSD sangat populer, bahkan implementasi lain ini memilih untuk mereplikasi API soket dengan fungsi seperti Unix, jadi Anda mendapat "deskriptor file", hanya digunakan untuk komunikasi TCP / IP, pada sistem yang tidak sebaliknya punya deskriptor file.
Bagian lain dari pertanyaan Anda adalah mengapa ada batasan? Itu karena cara tercepat untuk mengimplementasikan tabel pencarian deskriptor file adalah dengan sebuah array. Secara historis, batas tersebut dikodekan ke dalam kernel.
Berikut kode dalam Unix rilis 7 (1979) dengan batas 20 file deskriptor file per proses:
struct file *u_ofile[NOFILE]
#define NOFILE 20
Sebagai perbandingan, Linux secara dinamis mengalokasikan ruang untuk tabel deskriptor file suatu proses. Batas absolut default ke 8192, tetapi Anda dapat mengatur ini untuk apa pun yang Anda suka. Sistem saya mencantumkan 191072 di
/proc/sys/fs/file-max
.alloc_fdtable()
struct fdtable
#define NR_FILE 8192
Meskipun tidak ada lagi batasan absolut di Linux, namun kami tidak ingin membiarkan program menjadi gila, sehingga administrator (atau pengemas distribusi) umumnya menetapkan batas sumber daya. Lihatlah
/etc/security/limits.conf
, atau jalankanulimit -n
.sumber
File bukan hanya file di disk atau di memori; mereka adalah aliran data, yang hanya merupakan dua contoh.
Remote endpoint adalah contoh ketiga, dan Anda berinteraksi dengan mereka yang menggunakan soket.
sumber