【问题标题】:Using read() and write() system calls to access mmapped() memory使用 read() 和 write() 系统调用访问 mmapped() 内存
【发布时间】: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。

标签: c linux mmap


【解决方案1】:

希望我清楚

不幸的是,不是很。但听起来你想使用pipe 系统调用。它打开两个 fd。写入端写入的任何内容都可以在读取端读取。如果您在单个线程中执行所有这些操作,则必须小心,因为您可能会用完缓冲区空间,然后读/写调用将无限期挂起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-22
    • 2011-02-04
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多