LINUX.ORG.RU

Буферизация вывода на терминал


0

0

% cat test.c
#include <stdio.h>

int main( void )
{
        printf("Hello, world\n");
        fork();
        return 0;
}
% gcc test.c -o test
% ./test
Hello, world
% ./test | cat
Hello, world
Hello, world
%

Как я понимаю, сие чудное явление происходит потому, что при прямом выводе в терминал вывод не буферизуется, а при выводе в пайп или в файл - буферизуется. Я прав?
★★★★★

>Я прав?

нет.

потому что надо маны читать и гугль пользовать

напиши вместо "printf(" "fprintf(stderr" и на прямых системах тебе неудастся воспроизвести ситуацию

cvv ★★★★★
()
Ответ на: комментарий от cvv

> потому что надо маны читать и гугль пользовать

и вам тоже ...

> "printf(" "fprintf(stderr" и на прямых системах тебе неудастся воспроизвести ситуацию

по той простой причине, что 'cat' этот вывод не увидит.
а вот так увидит, и ничего не изменится:
        ./test 2>&1 | cat

2 Legioner
> Я прав?

да

idle ★★★★★
()

Legioner:

> ...при прямом выводе в терминал вывод не буферизуется, а при выводе в пайп или в файл - буферизуется. Я прав?

Почти.

При выводе на терминал printf осущестляет (по умолчанию) линейную буферизацию, а в пайп или файл -- блочную.

man 3 stdio

Die-Hard ★★★★★
()
Ответ на: комментарий от idle

>> потому что надо маны читать и гугль пользовать

>и вам тоже ...

>> "printf(" "fprintf(stderr" и на прямых системах тебе неудастся воспроизвести ситуацию

>по той простой причине, что 'cat' этот вывод не увидит.

извиняюсь, здесь вы правы

>а вот так увидит, и ничего не изменится:

> ./test 2>&1 | cat

но я всёравно останусь прав ибо stdio вывод на stderr не буферизирует.

cvv ★★★★★
()
Ответ на: комментарий от idle

Кстати, наблюдение, в свое время стОившее мне немало нервов:

В приведенном примере есть одна тонкость, связанная со спецификой cat: cat ВООБЩЕ не буферизует при выводе на терминал! Поэтому

fprintf(stderr,...) 2>&1 |cat

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

fprintf(stderr,...) 2>&1 | tr a b

ведет себя так же, как и просто

printf(stdout,...)

Die-Hard ★★★★★
()
Ответ на: комментарий от anonymous

>>cat ВООБЩЕ не буферизует

>Это GNU cat не буферизует.

Ессно. Но под Линухом как раз он:

man cat

. . .

-u (ignored)

. . .

Die-Hard ★★★★★
()

Спасибо за объяснения.

Legioner ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.