Linux, bir dosyayı Windows'un yaptığından tamamen farklı bir şekilde siler. İlk olarak, * unix yerel dosya sistemlerinde dosyaların nasıl yönetildiği hakkında kısa bir açıklama.
Dosya adı verilen çok düzeyli yapıda diskte tutulur i-node
. Her i düğümün, tek dosya sisteminde benzersiz bir numarası vardır. İ-node yapısı bir dosya hakkında, büyüklüğü, dosya için ayrılan veri blokları vb. Gibi farklı bilgileri tutar, fakat bu cevabın uğruna en önemli veri elemanı a'dır link counter
. directories
Dosyaları hakkında kayıtları tutmak dosyalardır. Her kayıt, referans aldığı i-düğüm numarasına, dosya adı uzunluğuna ve dosya adının kendisine sahiptir. Bu şema, birinin 'işaretçilere', yani aynı dosyaya, farklı isimlerdeki farklı yerlerde aynı linklere sahip olmasına izin verir. İ düğümünün bağlantı sayacı gerçekte bu i düğümüne başvuran bağlantıların sayısını tutar.
Bazı işlemler dosyayı açtığında ne olur? Öncelikle, open()
işlev dosya kaydını arar. Ardından, bu i düğüm için bellek içi i-düğüm yapısının zaten var olup olmadığını kontrol eder. Bu, bazı uygulamalar zaten bu dosyayı açmışsa gerçekleşebilir. Aksi takdirde, sistem yeni bir bellek içi i-düğüm yapısı başlatır. Sonra sistem, bellek içi i-düğüm yapısı açık sayacını arttırır ve uygulamaya, dosya tanımlayıcısına geri döner.
Bir dosyayı silmek için Linux kütüphane çağrısı denir unlink
. Bu işlev dosya kaydını bir dizinden kaldırır ve i-düğümünün bağlantı sayacını azaltır. Sistem bir bellek içi i-düğüm yapısının var olduğunu ve açık sayacının sıfır olmadığını tespit ettiğinde, bu çağrı kontrolü uygulamaya geri döndürür. Aksi halde link-counter'in sıfır olup olmadığını kontrol eder ve yaparsa sistem i-node ve i-node için ayrılan tüm blokları serbest bırakır ve uygulamaya geri döner.
Bir uygulamanın bir dosyayı kapatması durumunda ne olur? Fonksiyon close()
açık sayacı azaltır ve değerini kontrol eder. Değer sıfır değilse, işlev uygulamaya geri döner. Aksi halde, i-düğümü bağlantı sayacının sıfır olup olmadığını kontrol eder. Sıfır ise, uygulamaya geri dönmeden önce dosyanın tüm bloklarını ve i düğümünü serbest bırakır.
Bu mekanizma açıldığında bir dosyayı "silmenize" izin verir. Aynı zamanda, bir dosyayı açan uygulamanın dosyadaki verilere hala erişimi var. Bu nedenle, örneğin, JRE, diskte başka bir güncellenmiş sürüm varken, hala dosyanın sürümünü açık tutuyor.
Dahası, bu özellik, sisteminizde normal çalışmasını kesmeden tüm uygulamaların temel kütüphanesi olan glibc'yi (libc) güncellemenizi sağlar.
, Windows
20 yıl önce DOS altında FAT'ten başka bir dosya sistemi bilmiyorduk. Bu dosya sistemi farklı bir yapı ve yönetim ilkelerine sahiptir. Bu ilkeler açıldığında bir dosyayı silmenize izin vermez, bu nedenle DOS ve son zamanlarda Windows'un açık bir dosyadaki silme isteklerini reddetmesi gerekir. Muhtemelen NTFS, * nix dosya sistemleriyle aynı davranışı sağlar, ancak Microsoft, dosya silme alışkanlığını sürdürmeye karar verir.
İşte cevap. Kısa değil, ama şimdi fikrin var.
Düzenleme : Win32
karışıklık kaynakları hakkında iyi bir okuma : https://blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993
@Jon’a Krediler