Почему printf не работает при передаче по каналу Bash? - PullRequest
1 голос
/ 18 апреля 2011

У меня есть скрипт Bash work.sh, который получает что-то из STDIN и выводит его на STDOUT .

У меня также есть программа на C, return_input, который также получает что-то от STDIN и printf до STDOUT

Но когда я их цепью таким образом:

./work.sh |./return_input

printf вreturn_input вывод на экран только при выходе.Почему?

Упрощенно:

[root@ test]# cat work.sh
#!/bin/bash
for i in {1..5}
do
   echo test
   read
done

Выход cat return_input.c,

#include <stdio.h>

void return_input (void){
    char array[30];
    gets (array);
    printf("%s\n", array);
    printf("%#p\n", *(long *)(array+40));
}

main() {
    while(1 == 1)return_input();
    return 0;
}

Ответы [ 2 ]

4 голосов
/ 18 апреля 2011

Все операции ввода-вывода обычно буферизируются. Вот почему вы получаете выходные данные только после завершения программы, если не много данных для переполнения буфера и вывода во время выполнения.

Вы можете использовать функцию fflush, которая заставляет завершать операцию ввода-вывода и очищать буферы, если вы хотите видеть вывод в «реальном времени»

1 голос
/ 18 апреля 2011

Вы должны опубликовать некоторый код.

Попробуйте убедиться, что вывод очищен (используя fflush(stdout); в C после того, как вы написали в него), и / или что текст содержит переводы строк, так каккак правило, из-за этого вывод данных сбрасывается.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...