Performans sorunuzla ilgili olarak, borular IO'ya ihtiyaç duymadığından borulardan daha verimlidir. Bundan cmd1 | cmd2
daha verimlidir cmd1 > tmpfile; cmd2 < tmpfile
(bu tmpfile
, bir RAM diskine veya başka bir bellek cihazına pipe olarak desteklendiğinde doğru olmayabilir ; ancak adlandırılmış bir boru cmd1
ise, boru dolu hale geldiğinde çıktısını engelleyebildiği için arka planda çalıştırılmalıdır. ). Sonuçlarına ihtiyacınız varsa cmd1
ve yine de çıktısını göndermeniz gerekiyorsa cmd2
, diski okuma işlemlerinden kaçınarak paralel olarak çalışacak ve cmd1 | tee tmpfile | cmd2
izin vermelisiniz .cmd1
cmd2
cmd2
Adlandırılmış borular, birçok işlem aynı boruyu okuyup yazıyorsa kullanışlıdır. Bir program, dosya kullanması gereken IO'su için stdin / stdout kullanmak üzere tasarlanmadığında da faydalı olabilir . Dosyaları italik olarak koyarım çünkü adlandırılmış yöneltmeler tam olarak bellekte saklandıkları gibi depolama açısından dosyalar değildir ve bir dosya sistemi girişi olsalar bile (referans amaçlı) sabit bir arabellek boyutuna sahiptirler . Diğer şeylerin sadece düşünmek: UNIX dosya olmadan dosya sistemi girdilerine sahip /dev/null
veya başkaları girdileri /dev
veya /proc
.
Borular (adlandırılmış ve adlandırılmamış) sabit bir tampon boyutuna sahip olduklarından, bunlara okuma / yazma işlemleri engelleyebilir ve okuma / yazma işleminin IOWait durumunda kalmasına neden olabilir. Ayrıca, bir bellek arabelleğinden okurken ne zaman EOF alırsınız? Bu davranışa ilişkin kurallar iyi tanımlanmıştır ve erkekte bulunabilir.
Borularla yapamayacağınız bir şey (adlandırılmış ve adlandırılmamış) verilere geri bakmaktır. Bir bellek tamponu kullanılarak uygulandıkları için bu anlaşılabilir bir durumdur.
Hakkında "everything in Linux/Unix is a file"
aynı fikirde değilim. Adlandırılmış kanallarda dosya sistemi girişi vardır, ancak tam olarak dosya değildir. Adlandırılmamış borular, dosya sistemi girişlerine sahip değildir (belki de hariç /proc
). Ancak, UNIX'teki çoğu GÇ işlemi, adsız boru (ve soket) dahil olmak üzere bir dosya tanımlayıcısına ihtiyaç duyan okuma / yazma işlevi kullanılarak yapılır . Bunu söyleyebileceğimizi sanmıyorum "everything in Linux/Unix is a file"
, ama kesinlikle söyleyebiliriz "most IO in Linux/Unix is done using a file descriptor"
.