Sanıyorum neden Unix (ve dolayısıyla Linux) şeklindeki vizyon / tasarım ile ne çok şey vardır ve avantajları ondan kaynaklanan.
Hiç şüphe yok ki, fazladan bir süreci döndürmemek için ihmal edilemez bir performans avantajı var, ama bence daha fazlası var: Early Unix, bakarsanız bariz olmayan ama zarif bir avantaja sahip olan "her şey bir dosyadır" metaforuna sahipti. kabuk komut dosyası perspektifi yerine sistem açısından.
null
Komut satırı programınız ve /dev/null
cihaz düğümünüz olduğunu söyleyin . Kabuk-komut dosyası bakış açısına göre, foo | null
program aslında gerçekten yararlı ve kullanışlı ve yazmak foo >/dev/null
biraz daha uzun sürüyor ve garip görünebilir.
Ama işte iki alıştırma:
Programını uygulamak edelim null
mevcut Unix araçları ve kullanma /dev/null
- kolay: cat >/dev/null
. Bitti.
/dev/null
Açısından uygulayabilir misiniz null
?
Girdiyi atmak için C kodunun önemsiz olduğu konusunda kesinlikle haklısınız, bu nedenle görev için uygun bir sanal dosya bulundurmanın neden yararlı olduğu henüz belli olmayabilir .
Şunu düşünün: hemen hemen her programlama dili zaten dosyalarla, dosya tanımlayıcılarıyla ve dosya yollarıyla çalışmak zorunda, çünkü bunlar Unix'in “her şey bir dosyadır” paradigmasının bir parçasıydı.
Eğer sahip olduğunuz tek şey stdout'a yazılan programlarsa, program onları tüm yazarları yutan sanal bir dosyaya ya da tüm yazarları yutan bir programa yöneltecek şekilde umursamaz.
Şimdi, veri okumak veya yazmak için dosya yollarına sahip programlarınız varsa (çoğu programın yaptığı) - ve bu programlara "boş girdi" veya "bu çıktıyı at" işlevini eklemek istiyorsanız, bununla birlikte /dev/null
ücretsiz gelir.
Bunun zerafetinin, ilgili tüm programların kod karmaşıklığını azalttığına dikkat edin - sisteminizin gerçek bir "dosya adı" ile "dosya" olarak sağlayabileceği her genel ancak özel kullanım için, kodunuz özel komut eklemekten kaçınabilir -line seçenekleri ve işlemek için özel kod yolları.
İyi yazılım mühendisliği genellikle, bir problemin bazı öğelerini düşünmek daha kolay ancak esnek bir şekilde soyutlamak için iyi veya "doğal" metaforlar bulmaya dayanır , böylece temelde aynı yüksek seviye problemleri çözmeden çözebilirsiniz. zaman ve zihinsel enerjiyi sürekli olarak aynı alt seviye problemlere yeniden uygulama çözümlerine harcarlar.
"Her şey bir dosyadır" kaynaklara erişmek için böyle bir metafor gibi görünmektedir: open
Heirarchical bir ad alanında belirli bir yolu çağırıyorsunuz , nesneye referans (dosya tanımlayıcısı) alıyorsunuz read
ve write
dosya tanımlayıcılarına vb. Stdin / stdout / stderr, ayrıca sizin için önceden açılmış olan dosya tanımlayıcılarıdır. Borularınız sadece dosya ve dosya tanımlayıcılarıdır ve dosya yeniden yönlendirmesi tüm bu parçaları birbirine yapıştırmanıza izin verir.
Unix, bu soyutlamaların birlikte çalışmasının iyi olmasından dolayı, kısmen olduğu kadar başarılı oldu ve /dev/null
en iyisi, bütünün bir parçası olarak anlaşıldı.
Not: "Her şey bir dosyadır" un Unix sürümüne ve /dev/null
izleyen birçok sistemde uygulanan metaforun daha esnek ve güçlü bir genellemesine doğru atılan ilk adımlar gibi şeylere bakmaya değer .
Örneğin, Unix'te, özel dosya benzeri nesnelerin /dev/null
çekirdeğin kendisinde uygulanması gerekiyordu, ancak dosya / klasör biçiminde işlevselliği ortaya koymanın, o zamandan bu yana programlar için bir yol sağlayan çok sayıda sistem yapılmış olması yeterince yararlı olduğu ortaya çıktı. bunu yapmak için.
Bunlardan birincisi, Unix'i yapan aynı kişiler tarafından yapılan Plan 9 işletim sistemi idi. Daha sonra GNU Hurd, "çevirmenleri" ile benzer bir şey yaptı. Bu arada, Linux (şimdiye dek diğer ana sistemlere yayılmış olan) FUSE yazılımını almaya başladı.
cat foo | bar
(ölçek olarak) olduğundan daha kötüdürbar <foo
.cat
önemsiz bir programdır, ancak önemsiz bir program bile maliyetler yaratır (bazıları FIFO anlambilimine özgüdür - çünkü programlarseek()
FIFO'ların içinde olamaz) , örneğin, arama ile verimli bir şekilde uygulanabilecek bir program çok daha pahalı operasyonlar gerçekleştirebilir. Bir boru hattı verildiğinde,/dev/null
onun gibi bir karakter cihazıyla bu işlemleri sahtekarlaştırabilir veya gerçek bir dosya ile bunları uygulayabilir, ancak bir FIFO içeriğe duyarlı bir şekilde işlemeye izin vermez.