Перенаправление ввода / вывода с использованием cygwin и mingw

1804
KLee1

Я написал программу на C и скомпилировал ее с использованием MinGW. Когда я пытаюсь запустить эту программу в Cygwin, она, кажется, ведет себя нормально (то есть выводит правильный вывод и т. Д.)

Тем не менее, я пытаюсь передать вывод в программу, чтобы я мог проанализировать информацию из вывода программы. Тем не менее, кажется, что трубопровод не работает, потому что я не получаю никакой информации во второй программе.

Я подтвердил это с помощью следующих команд:

Эта команда работает нормально:

./prog 

Выполнение этой команды ничего не возвращает:

./prog | cat 

Эта команда проверяет первое:

./prog | wc 

Который возвращает:

0 0 0 

Я знаю, что сценарий (включая трубопровод из программы) прекрасно работает в любой среде Linux.

Кто-нибудь знает, почему трубопровод не работает в Cygwin? Спасибо!

3
Вы получаете такое же поведение, отправляя его на `more` или перенаправляя` stdout` к реальному файлу? Breakthrough 13 лет назад 0
@ Прорыв Да. Вывод в файл "./prog &> output.txt" или "./prog> output.txt" дает пустой файл output.txt KLee1 13 лет назад 0
несколько вопросов: вы печатаете на стандартный вывод? Вы печатаете правый конец символа строки для окон (\ r \ n)? Pablo Castellazzi 13 лет назад 0
@Pablo Castellazzi Я печатаю на стандартный вывод (просто с помощью printf), но вместо "\ r \ n" я использую "\ n". Я не думаю, что это должно изменить тот факт, что я ничего не получаю, не так ли? Я попытаюсь изменить окончание строки на \ r \ n и дам вам знать. KLee1 13 лет назад 0
Я только что написал небольшое приложение на C, которое использует printf и могло передавать по каналу wc и тому подобное. Какую версию Cygwin вы используете? Robb 13 лет назад 0
Вы должны связать свой исходный код Steven Penny 12 лет назад 0
Программа может открывать `/ dev / tty` и записывать в нее. Это единственное объяснение, которое я могу придумать для этого поведения. Fran 12 лет назад 0
Я полагаю, что проблема заключалась в том, что я не очищал поток вывода `fflush (stdout)` в моем приложении, что приводило к тому, что данные не выводились в файл, а выводились на экран должным образом (\ n разрывы строк). KLee1 12 лет назад 0
Промывка объяснила бы это. При записи в канал stdout буферизуется блоком (например, 4096 байт за раз, поэтому первый блок не записывается до тех пор, пока не будет записан 4097-й байт), но при записи в терминал stdout буферизуется строкой (т.е. каждая новая строка очищает буферы). Fran 12 лет назад 0

1 ответ на вопрос

0
Moreaki

Most probably this has to do with stdio buffering, as identified and explained previously in the comments section. In my MinGW projects, I have often used the following construct:

#define disable_stdout_buffering() do { \ setvbuf(stdout, NULL, _IONBF, 0); } while(0) int main(int argc, char *argv[]) { disable_stdout_buffering(); /* Your code */ exit(EXIT_SUCCESS); } 

Of course you can also add a call to fflush() in a preprocessor macro or when you output your data to stdout, however this way it does not add an additional library call to each buffer written to your console.