En azından uygulama detaylarına ihtiyacınız yoksa, oldukça basit.
Öncelikle, Linux'ta tüm dosya sistemleri (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) çekirdeğe uygulanır. Bazıları FUSE üzerinden kullanıcı koduna boşaltılabilir ve bazıları yalnızca bir çekirdek modülü biçiminde gelir ( yerel ZFS , lisans kısıtlamaları nedeniyle ikincisinin kayda değer bir örneğidir), ancak her iki durumda da bir çekirdek bileşeni kalır. Bu önemli bir temeldir.
Bir program, bir dosyadan okumak istediğinde, sonuçta bir şeklinde çekirdekte sona çeşitli sistem kitaplığı çağrıları yayınlayacak open()
, read()
, close()
dizi (muhtemelen ile seek()
iyi ölçmek için atılmış). Çekirdek sağlanan yolu ve dosya adını alır ve dosya sistemi ve aygıt G / Ç katmanı aracılığıyla bunları fiziksel okuma isteklerine (ve çoğu durumda da istek yazmak - örneğin atime güncellemelerini düşünün) bazı temel depolamaya çevirir.
Ancak, bu talepleri özellikle fiziksel, kalıcı depolamaya çevirmek zorunda değildir . Çekirdek sözleşmesi, belirli bir sistem çağrısı kümesinin yayınlanmasının söz konusu dosyanın içeriğini sağlayacağı yönündedir . Tam olarak bizim fiziksel alemimizde "dosya" bulunduğu yerde buna ikincildir.
Açık /proc
genellikle bilinenler olarak monte edilir procfs
. Bu özel bir dosya sistemi türüdür, ancak bir dosya sistemi olduğu için, örneğin bir ext3
yere monte edilmiş bir dosya sisteminden gerçekten farklı değildir . Böylece istek, tüm bu dosya ve dizinleri bilen ve çekirdek veri yapılarından belirli bilgileri geri alan procfs dosya sistemi sürücü koduna iletilir .
Bu durumda "depolama katmanı", çekirdek veri yapılarıdır ve procfs
bunlara erişmek için temiz ve kullanışlı bir arayüz sağlar. Montaj işlemlerinin /proc
yalnızca kurallara uygun olduğunu unutmayın; başka bir yere kolayca monte edebilirsiniz. Aslında, bu bazen yapılır, örneğin chroot hapishanelerinde, orada çalışan işlemin bir nedenden dolayı / proc'a erişmesi gerektiğinde yapılır.
Bazı dosyaya bir değer yazarsanız aynı şekilde çalışır; çekirdek düzeyinde, yani bir dizi çevirir open()
, seek()
, write()
, close()
yeniden dosya sistemi sürücüsü geçirilen olsun aramalar; Yine, bu özel durumda, procfs kodu.
file
Dönen görmenin özel nedeni empty
, procfs tarafından sunulan dosyaların çoğunun 0 bayt boyutunda olması. 0 bayt boyutunun çekirdek tarafında bir optimizasyon olması muhtemeldir (/ proc içindeki dosyaların çoğu dinamiktir ve uzunluğunu kolayca değiştirebilir, muhtemelen bir okunandan diğerine okunur ve her dizinin okunan her dosyanın uzunluğunu hesaplar) potansiyel olarak çok pahalı olabilir). Strace ya da benzeri bir araçla çalıştırarak kendi sisteminizde doğrulayabileceğiniz bu cevaba yapılan yorumlar, file
önce stat()
herhangi bir özel dosyayı algılamak için bir çağrı yapar ve ardından dosya boyutu 0 olarak bildirilirse, bu fırsatı değerlendirir. , iptal edin ve dosyayı boş olarak bildirin.
Bu davranış aslında belgelenmiştir edilebilir belirterek geçersiz -s
veya --special-files
üzerinde file
, çağırma olarak yan etkileri olabilir manuel sayfada belirtilen rağmen. Aşağıdaki alıntı, 17 Ekim 2011 tarihli, BSD dosya 5.11 kılavuz sayfasından alınmıştır.
Normalde, dosya yalnızca stat (2) raporlarının normal dosyalar olduğu argüman dosyalarının türünü okumaya ve belirlemeye çalışır. Bu, sorunları önler, çünkü özel dosyaları okumanın kendine özgü sonuçları olabilir. -s
Seçeneğin belirtilmesi, dosyanın blok veya karakter özel dosyaları olan bağımsız değişken dosyalarını da okumasına neden olur. Bu, özel dosyaları engelleyen ham disk bölümlerindeki verilerin dosya sistemi türlerini belirlemek için kullanışlıdır. Bu seçenek ayrıca bazı sistemlerde ham disk bölümleri için sıfır boyut bildirdiğinden, dosyanın stat (2) tarafından bildirildiği şekilde dosya boyutunu göz ardı etmesine neden olur .
strace file /proc/version
Veya ile baktığınızdaltrace -S /proc/version
, optimizasyon oldukça küçüktür.stat()
Önce bir çağrı yapar ve boyutun 0 olduğunu bulur, bu nedenle - atlaropen()
- ama ondan önce birkaç sihirli dosya yükler.