Apa yang dilakukan Linux berbeda yang memungkinkan saya untuk menghapus / mengganti file di mana Windows akan mengeluh file sedang digunakan?

29

Contoh yang saya miliki adalah Minecraft. Saat menjalankan Bukkit di Linux saya dapat menghapus atau memperbarui file .jar di folder / plugins dan cukup menjalankan perintah 'reload'.

Di Windows, saya harus menghapus seluruh proses server karena akan mengeluh bahwa file .jar saat ini sedang digunakan ketika saya mencoba untuk menghapus atau menggantinya.

Ini luar biasa bagi saya, tetapi mengapa itu bisa terjadi? Apa yang dilakukan Linux berbeda di sini?

MetaGuru
sumber

Jawaban:

34

Linux menghapus file yang sama sekali berbeda dari cara Windows. Pertama, penjelasan singkat tentang bagaimana file dikelola di * sistem file asli unix.

File disimpan di disk dalam struktur bertingkat yang disebut i-node. Setiap i-node memiliki nomor unik pada sistem file tunggal. Struktur i-simpul menyimpan informasi yang berbeda tentang file, seperti ukurannya, blok data yang dialokasikan untuk file dll, tetapi untuk kepentingan jawaban ini elemen data yang paling penting adalah a link counter. The directoriesadalah file yang menyimpan catatan tentang file. Setiap catatan memiliki nomor i-simpul yang dimaksud, panjang nama file dan nama file itu sendiri. Skema ini memungkinkan seseorang untuk memiliki 'pointer', yaitu 'tautan' ke file yang sama di tempat yang berbeda dengan nama yang berbeda. Penghitung tautan dari i-simpul sebenarnya menyimpan jumlah tautan yang merujuk ke simpul-i ini.

Apa yang terjadi ketika beberapa proses membuka file? Pertama open()fungsi mencari catatan file. Kemudian memeriksa apakah struktur i-node di memori untuk i-node ini sudah ada. Ini dapat terjadi jika beberapa aplikasi sudah membuka file ini. Jika tidak, sistem menginisialisasi struktur i-simpul di memori baru. Kemudian sistem meningkatkan penghitung terbuka struktur i-simpul di memori dan kembali ke aplikasi deskriptor file-nya.

Panggilan perpustakaan Linux untuk menghapus file disebut unlink. Fungsi ini menghapus catatan file dari direktori dan mengurangi penghitung tautan i-node. Jika sistem menemukan bahwa struktur simpul-i dalam memori ada dan penghitung terbukanya tidak nol maka panggilan ini mengembalikan kontrol ke aplikasi. Kalau tidak, ia memeriksa apakah penghitung-tautan menjadi nol dan jika tidak maka sistem membebaskan semua blok yang dialokasikan untuk i-simpul dan i-simpul itu sendiri dan kembali ke aplikasi.

Apa yang terjadi ketika aplikasi menutup file? Fungsi close()menurunkan counter terbuka dan memeriksa nilainya. Jika nilainya tidak nol, fungsi kembali ke aplikasi. Kalau tidak memeriksa apakah penghitung tautan i-simpul adalah nol. Jika nol, ia membebaskan semua blok file dan simpul-i sebelum kembali ke aplikasi.

Mekanisme ini memungkinkan Anda untuk "menghapus" file saat dibuka. Pada saat yang sama aplikasi yang membuka file masih memiliki akses ke data dalam file. Jadi, JRE, dalam contoh Anda, masih membuat versi file dibuka sementara ada versi lain yang diperbarui pada disk.

Terlebih lagi, fitur ini memungkinkan Anda untuk memperbarui glibc (libc) - perpustakaan inti semua aplikasi - di sistem Anda tanpa mengganggu operasi normalnya.

Windows

20 tahun yang lalu kami tidak tahu sistem file selain FAT di DOS. Sistem file ini memiliki struktur dan prinsip manajemen yang berbeda. Prinsip-prinsip ini tidak memungkinkan Anda untuk menghapus file ketika dibuka, jadi DOS dan Windows baru-baru ini harus menolak permintaan penghapusan pada file yang terbuka. Mungkin NTFS akan memungkinkan perilaku yang sama dengan sistem file * nix tetapi Microsoft memutuskan untuk mempertahankan perilaku kebiasaan penghapusan file.

Ini jawabannya. Tidak pendek, tetapi sekarang Anda punya ide.

Sunting : Bacaan yang bagus tentang sumber-sumber Win32kekacauan: https://blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993 Kredit ke @Jon

Serge
sumber
1
Mencoba mengganti nama file plugin saat server berjalan: i.imgur.com/xibyF.png
MetaGuru
buka jendela cmd, ubah ke direktori ini dan gunakan ren MonsterB.jar MonsterB.ja_- itu seharusnya bekerja. Ini berfungsi untuk file dll dan exe pasti.
Serge
1
tidak, Windows memetakan sebagian file yang dapat dieksekusi ke dalam memori
Serge
9
NTFS sebenarnya mendukungnya, tetapi perintah C Library fopenmemanggil CreateFiledengan FILE_SHARE_DELETEflag, jadi ia melarangnya untuk sebagian besar program yang membuka file.
Random832