在这个stackoverflow问题的答案中,据说sys调用返回后数据在内核中。但是数据不是输出到显示器,而不是在内核中吗?有人能更详细地解释一下吗?我不能在提到的文章中发表评论,因为我没有足够的声誉。
From:what is the different of using fflush(stdout) and not using it
当系统调用返回时,数据在你的内核中。但是现代操作系统也会缓冲这些数据。这是用来减少磁盘写入的数量,减少延迟和其他事情。这个缓冲区完全独立于程序内部的FILE缓冲区。
2条答案
按热度按时间643ylb081#
对于当前活动的交互式设备,如显示器,内核将快速显示数据。1您在另一个答案中提到的文本是关于写入存储设备的数据的。内核可能会暂时保存这些数据,合并与其他写操作。这里重要的是,您的程序不再对数据负责。即使您的进程在执行
fflush
,内核仍然会将数据写入存储器。(操作系统仍然会崩溃,数据也会因此丢失。)脚注
1根据操作系统的不同,可以通过各种方式停止终端输出,例如按Control-S,或者窗口当前可能被其他窗口覆盖,因此不进行更新。
aamkag612#
但是数据不是输出到显示器而不是内核中吗?
就操作系统而言,显示器只是另一个文件;
printf()
基本上只是fprintf()
的一个版本,假设输出应该转到stdout
,即标准输出流。该流通常被发送到显示器,但在许多操作系统中,您也可以将其重定向到文件或其他程序的输入。你提到的答案是说,当你写一个文件,(或流),您发送的数据由
printf()
缓冲(或fprintf()
)命令,并调用fflush()
触发上下文切换,将数据从其所在的缓冲区移动到内核中。您无法控制它发生了什么-它可能会立即发送到其目的地或保存在另一个缓冲区中,但无论哪种方式,它最终都会到达它应该到达的地方。