【发布时间】:2014-06-22 10:22:48
【问题描述】:
我想问是否有可能只使用系统调用如read() 和write() 来实现mread() 函数。我知道标准 C 库函数如 fread() 和 fwrite() 使用一种类型的缓冲区来读取。我想做同样的事情,但这次我想从缓冲区读取()和写入()到内存映射区域,反之亦然。
例如,我的 mread() 想要从内存映射中读取并存储到缓冲区中。创建一个新的 fd 只是为了将它用作我的 TEMPORARY 缓冲区是否有意义。然后我使用 read() 从内存映射区域读取到 fd..然后使用 write() 将 fd 中的内容存储到我的实际缓冲区中。
我希望我很清楚:) ..谢谢你的帮助!
【问题讨论】:
-
为什么不使用简单的 memcpy?
-
因为 memcpy() 不是系统调用,对吗?它是一个 C 标准函数......我们只能使用系统调用......
-
是的,我知道,但我在问为什么。为什么必须只使用系统调用?
-
原因是要了解它们的实际工作方式,因为这是一项任务。
-
据我所知,fread 和 fwrite 使用的缓冲区不是使用系统调用来管理的。事实上,fread 使用 read 来获得比数据请求更多的输入,并将读取的数据放在缓冲区中,然后 fwrite memcpy 到缓冲区,并在缓冲区已满或文件关闭或类似的情况下使用 write 刷新缓冲区。当您使用 mmaped 内存时,您可以直接修改它而无需系统调用,并且当操作系统认为它合适时或当您使用 msync 明确请求时,数据会保存到磁盘。如果您想做自己的版本或 fread-fwrite,请不要使用 mmap。