Di Linux, nama penuh fd ialah "Deskriptor fail", dan nama Cina ialah "deskriptor fail". Ia adalah indeks yang dicipta oleh kernel untuk menguruskan fail yang telah dibuka dengan cekap; ia sebenarnya bukan- Integer negatif yang digunakan untuk merujuk kepada fail yang dibuka Semua panggilan sistem yang menjalankan operasi I/O dilaksanakan melalui deskriptor fail.
Persekitaran pengendalian tutorial ini: sistem linux7.3, komputer Dell G3.
Di Linux, nama penuh fd ialah "Penerangan fail", dan nama Cina ialah "Penerangan Fail". Deskriptor fail ialah integer bukan negatif, pada asasnya nilai indeks (ayat ini sangat penting).
Kami tahu bahawa segala-galanya dalam sistem Linux boleh dianggap sebagai fail, dan fail boleh dibahagikan kepada: fail biasa, Fail direktori, fail pautan dan fail peranti. Apabila mengendalikan fail yang dipanggil ini, kita perlu mencari nama setiap kali kita beroperasi, yang memakan banyak masa dan kecekapan. Oleh itu, Linux menetapkan bahawa setiap fail sepadan dengan indeks, jadi apabila kita ingin mengendalikan fail, kita boleh terus mencari indeks dan mengendalikannya.
Penerangan fail ialah indeks yang dicipta oleh kernel untuk mengurus fail yang dibuka ini dengan cekap Ia adalah integer bukan negatif (biasanya integer kecil) yang digunakan untuk merujuk kepada fail yang dibuka , semua panggilan sistem yang melaksanakan operasi I/O dilaksanakan melalui deskriptor fail. Pada masa yang sama, ia juga ditetapkan bahawa apabila sistem baru dimulakan, 0 adalah input standard, 1 adalah output standard, dan 2 adalah ralat standard. Ini bermakna jika anda membuka fail baharu pada masa ini, deskriptor failnya ialah 3, dan jika anda membuka fail lain, deskriptor fail akan menjadi 4...
Inti Linux merawat semua fail terbuka Di sana ialah jadual deskriptor fail, yang menyimpan hubungan antara setiap deskriptor fail sebagai indeks dan fail terbuka Pemahaman mudah ialah tatasusunan seperti yang ditunjukkan di bawah. Kandungan tatasusunan adalah penunjuk untuk membuka fail satu demi satu.
Perkara di atas hanyalah pemahaman mudah Sebenarnya, mengenai deskriptor fail, kernel Linux mengekalkan 3 struktur data :
Selepas proses Linux dijalankan dimulakan, Blok kawalan PCB akan dibuat dalam ruang kernel Terdapat jadual deskriptor fail di dalam PCB, yang merekodkan semua deskriptor fail yang tersedia bagi proses semasa, iaitu semua fail terbuka bagi proses semasa. Setiap entri dalam jadual deskriptor peringkat proses merekodkan maklumat tentang deskriptor fail yang digunakan oleh satu proses Proses adalah bebas antara satu sama lain Jika satu proses menggunakan deskriptor fail 3, proses lain juga boleh menggunakannya. 3. Selain jadual deskriptor fail peringkat proses, sistem juga perlu mengekalkan dua jadual lain: jadual fail terbuka dan jadual i-node. Kedua-dua jadual ini menyimpan pemegang fail terbuka bagi setiap fail terbuka. Pemegang fail terbuka menyimpan semua maklumat yang berkaitan dengan fail terbuka.
Jadual deskriptor fail terbuka peringkat sistem:
jadual i-nod sistem fail:
Penerangan fail, pemegang fail terbuka Dan hubungan antara i -nod adalah seperti yang ditunjukkan di bawah:
Ini bermakna: deskriptor fail yang berbeza dari proses yang sama boleh menunjuk ke fail yang sama; (ini biasanya berlaku, kecuali untuk tiga fail khas 0, 1, dan 2);
Contoh membuka fail pada Linux
Sebagai contoh, gunakan vim test.py untuk membuka fail di Linux , biarkan ia terbuka, kemudian buka shell baharu, masukkan arahan pidof vim untuk mendapatkan nombor pid proses vim, dan kemudian ll /proc/$pid/fd untuk melihat proses vim yang digunakan senarai deskriptor fail.
/dev/pts ialah direktori tempat fail peranti konsol yang dibuat selepas log masuk jauh (telnet, ssh, dll.) berada. Kerana saya log masuk dari jauh melalui Xshell, deskriptor fail input standard 0, output standard 1 dan ralat standard 2 semuanya menghala ke konsol terminal maya /dev/pts/6. Lihat deskriptor fail ujian.py yang baru dibuka di bawah ternyata 4 Adakah anda bersetuju untuk bermula dari 3?
Saya sudah lama bergelut dengan masalah ini Setelah menyemak pelbagai maklumat, akhirnya saya temui sebabnya dalam satu forum dengan bantuan bos besar. anda perlu cuba mencari dalam bahasa Inggeris. Kerana prinsip editor seperti vim adalah untuk membuka fail sumber dan menyalinnya dahulu, kemudian menutup fail sumber dan kemudian membuka salinan anda sendiri Selepas mengubah suai fail dan menyimpannya, namakan semula salinan secara langsung dan tulis ganti fail sumber. Jadi apabila membuka fail sumber, gunakan deskriptor fail 3, dan kemudian buka salinan anda sendiri Sudah tiba masanya untuk menggunakan deskriptor fail 4, dan kemudian tutup fail sumber dengan fail. deskriptor 3 telah dikeluarkan, dan apabila kami menyemak, hanya 4 yang tinggal, yang di sini menunjuk kepada fail salinan yang dibuat oleh vim. Ini hanyalah idea umum. Untuk mendalami prinsip pelaksanaan vim - Duta Nebula Oort, berikut adalah tangkapan skrin maklumat di forum yang saya lihat pada masa itu, pautannya ada di sini: StackOverFlow.
Jika anda tidak percaya, anda boleh mencuba proses lain, seperti ekor.
Gunakan tail -f test.py untuk membuka fail di Linux, pastikan ia terbuka, kemudian buka shell baharu dan masukkan arahan pidof tail untuk mendapatkan tail Nombor pid proses, kemudian ll /proc/$pid/fd Semak senarai deskriptor fail yang digunakan oleh proses ekor Anda boleh melihat bahawa deskriptor fail memang digunakan bermula dari 3 . Tail tidak mengubah suai fail dalam editor, jadi fail sumber dibuka terus menggunakan deskriptor fail. Malah, anda boleh menggunakan perintah ll /proc/$pid/fd untuk mendapatkan penggunaan deskriptor fail bagi sebarang proses yang sedang berjalan.
Pengetahuan lanjutan: Sistem konfigurasi Linux bilangan maksimum deskriptor fail terbuka
( 1 ) Sekatan peringkat sistem
Secara teorinya, anda boleh membuka seberapa banyak deskriptor fail kerana terdapat memori sistem Namun, dalam praktiknya, kernel akan mengendalikannya dengan sewajarnya, bilangan maksimum fail terbuka ialah 10% daripada memori sistem (dikira dalam KB ), yang dipanggil Ini ialah sekatan peringkat sistem. Nombor ini boleh dilihat melalui perintah cat /proc/sys/fs/file-max atau sysctl -a |
Terdapat dua cara untuk menukar sekatan peringkat sistem: perubahan sementara dan perubahan kekal:sysctl -w fs.file-max=xxxx, dengan xxxx ialah nombor yang akan ditetapkan.
/etc/sysctl.conf dan tambah fs.file-max=xxxx pada penghujungnya, di mana xxxx Ia adalah nombor yang perlu ditetapkan. Selepas menyimpan dan keluar, gunakan perintah sysctl -p untuk menjadikannya berkesan.
(2) Sekatan peringkat pengguna
Pada masa yang sama, untuk mengawal sumber fail yang digunakan oleh setiap proses, kernel juga akan membuka fail maksimum untuk satu proses Had lalai ialah had peringkat pengguna. Nilai lalai untuk sistem 32-bit biasanya 1024, dan nilai lalai untuk sistem 64-bit biasanya 65535. Anda boleh menggunakan perintahulimit -n untuk melihatnya.
Terdapat dua cara untuk menukar sekatan peringkat pengguna: perubahan sementara dan perubahan kekal:ulimit -SHn xxxx untuk mengubah suainya, dengan xxxx ialah nombor yang akan ditetapkan.
/etc/security/limits.conf dan ubah suai hard nofile xxxx dan soft nofile xxxx, dengan xxxx ialah nombor yang perlu ditetapkan. Simpan dan keluar. Mengenai perbezaan antara keras dan lembut, sila rujuk pautan rujukan ke-5 di bawah.
Tutorial Video Linux"
Atas ialah kandungan terperinci apa itu linux fd. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!