为什么sleep()会阻塞std::ostream

Why does sleep() block std::ostream

本文关键字:std ostream sleep 为什么      更新时间:2023-10-16

给定以下条件:

const char opn[8] = { 0x16, 'O', 'P', 'N', 0x17, 0xa8, 0xa9, '' };
std::cout << opn;
sleep(5);

该字符串只会在5秒钟后写入cout。预期的行为是将消息打印到cout,然后等待几秒钟。

为什么会发生这种情况?

输出通常是缓冲的,所以在缓冲区满或文件关闭之前不会输出。您需要手动flush输出;例如:

std::cout << i << " " << std::flush;

如果您想插入换行符,可以使用std::endl,它既插入换行符,又刷新流:

std::cout << i << " " << std::endl;

std::cout默认情况下是缓冲的,因此不会立即打印消息,只有当std::cout的缓冲区被刷新时,即程序终止时。

使用

std::cout << opn << std::flush;

正如@RemyLebeau在对这个答案的评论中所说,<< std::endl等价于<< 'n' << std::flush;,并且还会刷新缓冲区。


此外,您还缺少后面的null字节,因此您的程序目前尚未定义。

cout是缓冲的,因此它保存了正在打印的中间内容,并在刷新时一次打印所有内容。

您可以将<< std::endl;添加到打印i的行中,也可以手动刷新缓冲区。