LINUX.ORG.RU

Непонятное поведение sleep

 ,


0

4

Решил поиграть с консолью, наткнулся на следующее:

#include<stdio.h>

int main()
{
	while(1)
		printf("A");

	return 0;
}

как и положено, все забивает A. Однако если так:

#include<stdio.h>

int main()
{
	while(1)
	{
		printf("A");
		usleep(1000);
	}

	return 0;
}
То вместо вывода A с задержкой, оно после долгих раздумий выплевывает целую пачку и снова долго думает. Так же себя ведет и sleep. С чем это может быть связано?


Буферизация потока данных stdout.

Deleted
()

Дата регистрации: 16.09.2014 21:56:34

stdout буферизированый, почитай об этом.
Как быстрый хак здесь и сейчас можешь выводить в stderr через fprintf(stderr, «A»).

d ★★★★
()

И ещё: обычные строки (не форматы) лучше выводить через puts (добавляет символ новой строки) или fputs (не добавляет, требует дополнительного аргумента, указывающего на поток данных/файл, куда писать).

Deleted
()
#include<string.h>
#include<unistd.h>
write(STDOUT_FILENO,msg,strlen(msg)-1);
anonymous
()
Ответ на: комментарий от edigaryev

Буферизация отключится только для программы или и после выхода из нее? Чем грозит ее отсутствие?

Soyfer
() автор топика
Ответ на: комментарий от Soyfer

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

t1nman
()
Ответ на: комментарий от Soyfer

Буферизация отключится только для программы

Буферизация отключается для конкретного потока данных (например, stdout), а не для всей программы.

Чем грозит ее отсутствие?

Потерей производительности, в следствие увеличения числа системных вызовов типа write().

edigaryev ★★★★★
()

Если более формально подытожить, то printf(...) это обертка для fprintf(stdout, ...). (FILE *)stdout это местный поток, связанный с к-л дескриптором, и он умеет в буферизацию — накапливает твои принты в буфере и сливает его в дескриптор при переполнении, потому что дергать ядро на каждую букву это дорого и моветон. Изменить параметры буферизации можно через setbuf/setvbuf(stdout, ...). Принудительно запихать все накопленное в дескриптор можно с помощью fflush(stdout).

Ну и неплохо бы почитать что-то по сишке, потому что такие вопросы ну ты понел.

anonymous
()

выводи в stderr - он не буферизуется

x905 ★★★★★
()

2 чая анониму в треде за write(STDOUT_FILENO, ...)

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