(如何)write() 系统调用是否在内核中存储数据?

问题描述 投票:0回答:2

在这个 stackoverflow 问题的答案中,据说在 sys 调用返回后,数据位于内核中。但是数据不是输出到显示器上而不再在内核中了吗?有人可以更详细地解释一下吗?我无法在提到的文章中发表评论,因为我没有足够的声誉。

来自:使用 fflush(stdout) 和不使用它有什么不同

当系统调用返回时,数据就在您的内核中。但现代操作系统也会缓冲这些数据。这用于减少磁盘写入次数、减少延迟等。该缓冲区完全独立于程序内的 FILE 缓冲区。

c system-calls sys
2个回答
1
投票

对于当前活动的交互设备,例如显示器,内核将快速显示数据。1您在另一个答案中引用的文本是关于将数据写入存储设备的。内核可能会短暂保存该数据,以便将其与其他写入操作结合起来。这里重要的是您的程序不再对数据负责。即使您的进程在执行

fflush
后退出或崩溃,内核仍然会将数据写入存储。 (操作系统仍然可能崩溃,并且数据可能会因此丢失。)

脚注

1 根据操作系统的不同,可以通过各种方式停止终端输出,例如按 Control-S,或者某个窗口当前可能被其他窗口覆盖,因此不会更新。


1
投票

但是数据不是输出到显示器上而内核中就没有了吗?

对于操作系统来说,显示只是另一个文件;

printf()
基本上只是
fprintf()
的一个版本,它假设输出应该转到
stdout
,即标准输出流。该流通常会发送到显示器,但在许多操作系统中,您还可以将其重定向到文件或其他程序的输入。

您提到的答案是说,当您写入文件(或流)时,您发送的数据由

printf()
(或
fprintf()
)命令缓冲,并且调用
fflush()
会触发上下文切换将数据从其所在的缓冲区移入内核。从那里,您无法控制它会发生什么 - 它可能会立即发送到目的地或保存在另一个缓冲区中,但无论哪种方式,它最终都会到达它应该在的地方。

© www.soinside.com 2019 - 2024. All rights reserved.