I / O redirection menggunakan cygwin dan mingw

3

Saya telah menulis sebuah program di C dan mengkompilasinya menggunakan MinGW. Ketika saya mencoba menjalankan program itu di Cygwin, sepertinya berperilaku normal (yaitu mencetak hasil yang benar, dll.)

Namun, saya mencoba menyalurkan output ke program sehingga saya dapat mengurai informasi dari output program. Namun, perpipaan tampaknya tidak berfungsi karena saya tidak mendapatkan input apa pun ke dalam program kedua.

Saya telah mengkonfirmasi ini dengan menggunakan perintah berikut:

Perintah ini tampaknya berfungsi dengan baik:

./prog 

Melakukan perintah ini tidak menghasilkan apa-apa:

./prog | cat

Perintah ini memverifikasi yang pertama:

./prog | wc

Yang mengembalikan:

0 0 0

Saya tahu bahwa skrip (termasuk perpipaan dari program) berfungsi dengan baik di semua lingkungan Linux.

Adakah yang tahu mengapa perpipaan tidak berfungsi di Cygwin? Terima kasih!

KLee1
sumber
Apakah Anda mendapatkan perilaku yang sama dengan moremengarahkan atau mengalihkan stdoutke file yang sebenarnya?
Terobosan
@Breakthrough Ya.
Meng
beberapa pertanyaan: apakah Anda mencetak ke stdout? apakah Anda mencetak karakter ujung kanan baris untuk windows (\ r \ n)?
Pablo Castellazzi
@Pablo Castellazzi Saya mencetak ke stdout (hanya menggunakan printf), tetapi saya menggunakan "\ n" bukannya "\ r \ n." Saya tidak berpikir itu harus mengubah fakta bahwa saya tidak mendapatkan output apa pun di al, kan? Saya akan mencoba mengubah akhir baris menjadi \ r \ n dan memberi tahu Anda.
KLee1
Saya baru saja menulis aplikasi C kecil yang menggunakan printf dan dapat menyalurkan ke wc dan kurang dan semacamnya. Cygwin versi apa yang Anda jalankan?
Robb

Jawaban:

0

Kemungkinan besar ini ada hubungannya dengan buffering stdio, seperti yang diidentifikasi dan dijelaskan sebelumnya di bagian komentar. Dalam proyek MinGW saya, saya sering menggunakan konstruk berikut:

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

int main (int argc, char * argv []) {
    disable_stdout_buffering ();
    / * Kode Anda * /
    keluar (EXIT_SUCCESS);
}

Tentu saja Anda juga dapat menambahkan panggilan ke fflush()dalam makro preprosesor atau saat Anda mengeluarkan data ke stdout, namun cara ini tidak menambahkan panggilan pustaka tambahan ke setiap buffer yang ditulis ke konsol Anda.

Moreaki
sumber