Linux'un şu anda kullanımda olduğundan şikayet edeceği dosyaları kaldırmam / değiştirmeme izin veren Linux'un farklı yaptığı nedir?


29

Elimdeki örnek Minecraft. Linux'ta Bukkit'i çalıştırırken, / plugins klasöründeki .jar dosyalarını kaldırabilir veya güncelleyebilirim ve sadece 'yeniden yükle' komutunu çalıştırabilirim.

Windows'ta, tüm sunucu işlemini aşağıya çekmek zorundayım, çünkü kaldırmaya veya değiştirmeye çalıştığımda .jar dosyasının şu anda kullanımda olduğundan şikayet edecek.

Bu benim için harika, ama neden oldu? Linux burada farklı ne yapıyor?

Yanıtlar:


34

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. directoriesDosyaları 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 : Win32karışıklık kaynakları hakkında iyi bir okuma : https://blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993 @Jon’a Krediler


1
Sunucu çalışırken yeniden adlandırılan eklenti dosyasını denedim: i.imgur.com/xibyF.png
MetaGuru

cmd penceresini açın, bu dizine geçin ve kullanın ren MonsterB.jar MonsterB.ja_- çalışması gerekir. Kesinlikle dll ve exe dosyaları için çalışıyor.
Serge

1
hayır, Windows çalıştırılabilir dosyanın bölümlerini belleğe eşler
Serge

9
NTFS aslında destekliyor, ancak C Library fopenkomutu ile çağırır CreateFile.FILE_SHARE_DELETE açık dosyalar çoğu programları için ona izin vermiyor böylece, bayrak.
Random832

2
Zorunlu Raymond Chen bağlantısı: blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993
Jon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.