Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用read()和write()系统调用访问mmapped()内存_C_Linux_Mmap - Fatal编程技术网

C 使用read()和write()系统调用访问mmapped()内存

C 使用read()和write()系统调用访问mmapped()内存,c,linux,mmap,C,Linux,Mmap,我想问一下,是否可以只使用诸如read()和write()之类的系统调用来实现mread()函数。我知道诸如fread()和fwrite()之类的标准C库函数使用一种类型的缓冲区进行读取。我也想这样做,但这次我想从缓冲区读()和写(),到内存映射区域,反之亦然。 例如,我的mread()希望从内存映射中读取数据并存储到缓冲区中。创建一个新的fd作为临时缓冲区是否有意义。然后我使用read()从内存映射区域读取到fd..,然后使用write()将fd中的内容存储到我的实际buff中。 我希望我是清

我想问一下,是否可以只使用诸如read()和write()之类的系统调用来实现mread()函数。我知道诸如fread()和fwrite()之类的标准C库函数使用一种类型的缓冲区进行读取。我也想这样做,但这次我想从缓冲区读()和写(),到内存映射区域,反之亦然。 例如,我的mread()希望从内存映射中读取数据并存储到缓冲区中。创建一个新的fd作为临时缓冲区是否有意义。然后我使用read()从内存映射区域读取到fd..,然后使用write()将fd中的内容存储到我的实际buff中。
我希望我是清楚的:)…谢谢你的帮助

我希望我是清楚的


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

为什么不使用简单的memcpy?因为memcpy()不是系统调用,对吗?这是一个C标准函数…我们只能使用系统调用…是的,我知道,但我问为什么。为什么必须只使用系统调用?原因是要了解它们实际上是如何工作的,因为这是一个赋值。据我所知,fread和fwrite使用的缓冲区不是使用系统调用来管理的。事实上,fread使用read进行更多数据请求的输入,并将读取的数据放入缓冲区,然后将memcpy写入缓冲区,并在缓冲区已满、文件关闭或类似情况下使用write刷新缓冲区。当您使用mmaped内存时,您可以直接修改它,而无需系统调用,并且当操作系统认为数据合适时,或者当您使用msync显式请求数据时,数据会保存到磁盘。如果你想做你自己的版本,不要使用mmap。