Açık dosyalar linux sistemlerinde nasıl davranır?


17

Bir günlük dosyasını "foo.log.old" olarak yeniden adlandırdım ve uygulamanın "foo.log" da yeni bir günlük dosyası yazmaya başlayacağını varsaydım. Logfile'ı yeni adına izlediğini ve "foo.log.old" a satır eklediğini keşfettiğimde şaşırdım.

Windows'da bu tür davranışlara aşina değilim - bunu uygulamanın mümkün olup olmadığını bilmiyorum. Linux'ta bu davranış tam olarak nasıl uygulanır? Nerede daha fazla bilgi edinebilirim?


Bunu bir cevap olarak koymuyorum çünkü gerçekten bilmiyorum ama bence bir dosyayı taşıdığınızda değiştirilmeyen inodes ile ilgili.
mathepic

Yanıtlar:


20

Programlar dosyalara, adın sadece bir referans olduğu (ve muhtemelen benzersiz bir referans olmadığı) dosya sistemi tarafından tutulan bir sayı (geleneksel unix dosya sistemlerinde inode olarak adlandırılır) aracılığıyla bağlanır.

Dikkat edilmesi gereken birkaç şey:

  1. Dosyayı kullanarak mvtaşımak, alt dosya numarasını dosya sistemleri arasında taşımadığınız sürece değiştirmez ( orijinali kullanmaya cpdaha sonra eşittir rm).
  2. Birden fazla ad tek bir dosyaya bağlanabildiğinden (yani sabit bağlantılarımız varsa), "silinmiş" dosyalardaki veriler , alt dosyaya yapılan tüm referanslar kaybolana kadar kaybolmaz.
  3. Belki de en önemlisi: bir program opensa dosyası, ona bağlı bir dosya adı olan bir dosyaya (verinin ne zaman silineceğine dair) bir referans yapar.

Bu, aşağıdaki gibi çeşitli davranışlara yol açar:

  • Bir program openokumak için bir dosya olabilir , ancak kullanıcı rmkomut satırında edindikten sonraya kadar okumaz ve program yine de verilere erişebilir .
  • Karşılaştığınız mvdosya : dosya ve dosyayı açık olan programlar arasındaki ilişkiyi kesmez (dosya sistemi sınırları içinde hareket etmezseniz, bu durumda programın üzerinde çalışılacak orijinalin bir sürümü hala vardır).
  • Bir program openyazmak için bir dosyayı rmdüzenlediyse ve kullanıcının komut satırındaki son dosya adı varsa, program dosyaları doğrudan dosyaya koymaya devam edebilir, ancak kapanır kapanmaz bu verilere artık referans olmayacaktır ve gidecek.
  • Bir veya daha fazla dosya üzerinden iletişim kuran iki program, dosyaları bitirdikten sonra kaldırarak ham, kısmi güvenlik elde edebilir open. (Bu gerçek bir güvenlik zihni değildir , sadece bir boşluk deliğini bir yarış durumuna dönüştürür.)

1
@ Dmckee ile hemfikirim, sadece not etmek istedim: bir program openokuma ve yazma için bir dosya olabilir (sorudaki günlük dosyasına ne olduğu gibi).
jsbillings

@jsbillings: Evet, ancak bir risk var. Tüm dosya sistemi adları kaybolduysa, GB'leri kapatır açmaz sabah çiğ gibi buharlaşacak açık bir dosyaya yazabilirsiniz.
dmckee

1
Ayrıca, inode çekirdeğe kopyalanır ve disk kopyası değil, üzerinde çalıştırılan şey budur. Yani dosya mv'd veya cp 'olabilir, ancak açık bir dosya zaten disk sürümü ile değil, çekirdek veri yapılarıyla çalışıyor. Dolayısıyla, başka bir dosyayı yazmaya açık olan dosyaya kopyalarsanız, işlem yine de eski dosyadaki göreli konuma yazılır. Apache httpd gibi programların günlük dosyalarını kapatan ve yeniden açan bir sinyal işleyicisine sahip olmasının nedeni budur.
Arcege

0

Bu davranışın nasıl uygulandığını gerçekten görmek için bazı Unix programlama kitaplarına bakabilirsiniz. Mathepic bir inode ile ilgili olduğu için haklıdır. Asıl yol adı sadece dosyayı açmak için kullanılır, bu yapıldıktan sonra program açık dosya tanımlayıcısı tarafından referans alır. Dosya tanımlayıcı sırayla inode'a başvurur, bu durumda temel dosya adının değişip değişmediği umursamaz.

Bunu Windows'da uygulamak kadarıyla, bu başka bir site için bir soru.

Kitaplara çarpmadan bunun hakkında daha fazla bilgi edinmek için linux dosya sistemlerini ve inode'ları arayın. Açık bir cevap olmayabilir, ama nedenini anlayabileceksiniz.


4
"Arayın - muhtemelen iyi bir cevap bulamazsınız ancak anlayacaksınız" iyi bir yanıt değildir.
mattdm
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.