Cygwin ve mingw kullanarak G / Ç yönlendirmesi


3

C dilinde bir program yazdım ve MinGW kullanarak derledim. Bu programı Cygwin'de çalıştırmaya çalıştığımda normal davranıyor gibi görünüyor (yani doğru çıktılar yazdırıyor vs.)

Ancak, programın çıktısından bilgileri ayrıştırmak için bir programın çıktısını aktarmaya çalışıyorum. Ancak, ikinci programa herhangi bir girdi alamadığım için borular çalışıyor gibi görünmüyor.

Bunu aşağıdaki komutları kullanarak onayladım:

Bu komut iyi çalışıyor gibi görünüyor:

./prog 

Bu komutu gerçekleştirmek hiçbir şey döndürmez:

./prog | cat

Bu komut ilkini doğrular:

./prog | wc

Hangi döner:

0 0 0

Komut dosyasının (programın boruları dahil) tüm Linux ortamında mükemmel çalıştığını biliyorum.

Borunun neden Cygwin'de çalışmadığı konusunda fikri olan var mı? Teşekkürler!


Aynı davranışı alıp, gerçek bir dosyaya moreyönlendiriyor stdoutmusunuz?
Atılım

@Breakthrough Evet. "./Prog &> output.txt" veya "./prog> output.txt" dosyasına çıkış yapmak, boş bir output.txt
dosyası

birkaç soru: stdout'a yazdırıyor musunuz? Windows için çizgi karakterinin sağ ucunu mı yazdırıyorsunuz (\ r \ n)?
Pablo Castellazzi,

@Pablo Castellazzi Stdout'a yazdırıyorum (sadece printf kullanarak), ancak "\ r \ n" yerine "\ n" kullanıyorum. Bunun bir sonuç alamadığım gerçeğini değiştirmesi gerektiğini düşünmüyorum, değil mi? Satır sonlarını \ r \ n olarak değiştirmeyi deneyeceğim ve size haber vereceğim.
KLee1

Sadece printf kullanan ve wc ve daha azına yöneltebilen küçük bir C uygulaması yazdım. Hangi Cygwin sürümünü kullanıyorsunuz?
Robb,

Yanıtlar:


0

Büyük olasılıkla bunun daha önce yorumlar bölümünde tanımlandığı ve açıklandığı gibi stdio tamponlaması ile ilgisi var. MinGW projelerimde sıklıkla aşağıdaki yapıyı kullandım:

#define disable_stdout_buffering () do {\
               setvbuf (stdout, NULL, _IONBF, 0); } süre (0)

int main (int argc, char * argv []) {
    ) (Disable_stdout_buffering;
    /* Senin kodun */
    çıkış (EXIT_SUCCESS);
}

Elbette fflush(), bir önişlemci makrosuna bir çağrı da ekleyebilir veya verilerinizi stdout'a çıktığınızda, konsolunuza yazılan her arabellek için ek bir kütüphane çağrısı eklemez.

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.