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.
nullKomut satırı programınız ve /dev/nullcihaz düğümünüz olduğunu söyleyin . Kabuk-komut dosyası bakış açısına göre, foo | nullprogram aslında gerçekten yararlı ve kullanışlı ve yazmak foo >/dev/nullbiraz daha uzun sürüyor ve garip görünebilir.
Ama işte iki alıştırma:
Programını uygulamak edelim nullmevcut Unix araçları ve kullanma /dev/null- kolay: cat >/dev/null. Bitti.
/dev/nullAçı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: openHeirarchical bir ad alanında belirli bir yolu çağırıyorsunuz , nesneye referans (dosya tanımlayıcısı) alıyorsunuz readve writedosya 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/nullen 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/nullizleyen 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/nullonun 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.