Saya mencoba untuk mendapatkan seluruh gambar dengan deskriptor file. Katakanlah saya memiliki process1 yang awalnya memiliki deskriptor file ini:
_process1_
| |
| 0 stdin |
| 1 stdout |
| 2 stderr |
|__________|
Lalu saya menutup file descriptor 1:
close(1);
Deskriptor file 1 menerjemahkan (menunjuk) ke struktur FILE stdout di Open Files Table kernel .
Dengan kode di atas file deskriptor 1 akan dihapus dari tabel proses yang menjadi:
_process1_
| |
| 0 stdin |
| 2 stderr |
|__________|
Tetapi apa yang terjadi di kernel? Apakah stdout
struktur FILE dapat dialokasikan kembali? Bagaimana mungkin jika stdout adalah file khusus (monitor) dan mungkin digunakan oleh proses lain? Bagaimana dengan struktur FILE yang hanya file biasa (misalnya .txt)? Bagaimana jika file seperti itu digunakan oleh proses lain?
sumber
open
berhasil.Dalam hal ini tidak banyak yang akan terjadi. stdin, stdout, dan stderr semuanya cenderung merupakan klon dari deskriptor file yang sama. Penghitung referensi untuk deskriptor file akan dikurangi oleh satu. Deskriptor file yang sama biasanya dipegang oleh shell tempat program dijalankan, sehingga deskriptor file perlu disimpan.
Kernel menyimpan jumlah referensi untuk semua file (inode) yang terbuka. Selama jumlah referensi lebih besar dari nol file akan disimpan. Saya berharap penghitung terpisah disimpan untuk menangani file terbuka. Setelah ini mencapai nol, kernel dapat melepaskan memori yang digunakan oleh file handle.
Ketika semua referensi ke file (entri direktori dan pegangan file) telah dihapus, kode sistem file akan menandai inode untuk digunakan kembali. Setiap blok file telah tersedia untuk alokasi. Banyak sistem file akan menghapus pointer blok di inode ketika dirilis. Ini membuat memulihkan file yang dihapus menjadi sulit. Pembaruan ke disk dapat disangga dan diselesaikan di lain waktu.
sumber
cat > some.file
, kucing mendapat EOF pada stdin, tetapi cangkangnya tidak. (2) Mengapa penghitungan referensi? Mengapa tidak mengumpulkan sampah? Bukankah GC jauh lebih baik di ruang pengguna?cat > some.file
apa yang sebenarnya dilakukan adalah forking, membuka 'some.file' dan menugaskannya ke file deskriptor 1, maka ia melakukannyaexec("cat")
. Ketika suatu proses adalah exec () 'd, itu mewarisi deskriptor file terbuka.