stdout tamponlamayı kaldırmak için “tamponunu kaldır” veya “stdbuf” mu?


13

Tamponlayıcı (1) ve stdbuf (1) arasında bir fark var mı? Topladığımdan, unbuffer, başlangıçta libc işlev kümesi (X) buf'i çağırmanın ve sonra şeylerin olmasına izin vermenin "en iyi çabasından" fazlasını yapar mı?

Yanıtlar:


14

Tamamen farklı şekillerde çalışırlar.

Program arabelleğe alma, adlandırılmış komutu çalıştırmak için bekliyoruz kullanır. Bekleme, çocuk sürecinin stdout'una eklemek için sahte bir yaratılış oluşturduğundan, çocuk blok tamponlama yerine satır tamponlama kullanması gerektiğini kandırır. Bazı programlar isatty (stdout) doğru olduğunda davranışlarını değiştirir, diğerleri olmaz ve hangisinin hangisinin hangisinin olmayacağını bilmek çok zordur.

Program stdbuf, dinamik olarak yüklenmiş ikili dosyalar için libstdbuf'u libc önüne koymaya çalışır. Burada libstdbuf, libc stdio çağrılarının varsayılan arabellekleme stratejisini yeniden tanımlar.

Bunu tarafından buldum

 apt-get source expect coreutils

ve her program için ilgili kaynağın okunması.


Bazı endişe verici şeyler (manpage'den): unbuffer -parabelleğe alma işlemine bir girdi besleme girişi çıkarsa yanlış çalışıyor gibi görünebilir. process1 | unbuffer -p process2 | process3Şunu düşünün: İşlem1 çıkarsa, işlem2 henüz bitmemiş olabilir.
Unbuffer'ın

Stdbuf, C akışlarını kullanan programların stdin arabelleğe alınmasını da kontrol edebilir gibi görünüyor, ki bu önemli görünüyor. Belki de bu, gelecekteki okuyucuların yararı için cevaba dahil edilmelidir.
dan3
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.