为什么我不能写mmaped文件

阿克尔

首先,我创建一个文件并向其中回显一些字符,然后显示它的文件:

sasdfasdfas

asfdasfsadf

然后在C程序中,使用以下命令打开文件:

int fd=open("file",O_RDWR);

用以下命令映射文件:

unsigned char *addr=mmap(NULL,length,PROT_WRITE,MAP_PRIVATE,fd,pa_offset);

其中length是关于fstat所获取文件大小的int值,而pa_offset为0。

open函数和mmap函数都返回良好,也就是说,open返回一个正整数,如3,而mmap返回一个正确的地址,如0x7fd36999d000。

我从地址读取文件,一切正常。当我对其进行写入时,似乎在我打印程序中的内存时成功写入了,但是如果我注意它,则实际文件内容不会更改。

我已经尝试了一些尝试,例如使用msync(),但是都具有相同的结果。

你们谁愿意告诉我我在哪里跌跌撞撞?我只想从mmap -_-写入文件

姓名

你要MAP_SHARED而不是MAP_PRIVATE

unsigned char *addr=mmap(NULL,length,PROT_WRITE,MAP_PRIVATE,fd,pa_offset);
                                                ↑↑↑↑↑↑↑↑↑↑↑

GNU C库手册(重点是我的):

MAP_PRIVATE-这指定对区域的写操作永远不要写回附件。而是为该过程创建一个副本,如果内存不足,该区域将正常交换。没有其他进程会看到更改。

MAP_SHARED-这指定对区域的写操作将被写回到文件中。所做的更改将立即与映射同一文件的其他进程共享。请注意,实际书写可能随时发生。msync如果使用常规I / O的其他进程获取文件的一致视图很重要,则需要使用,如下所述。

请参阅man mmap

换句话说,MAP_PRIVATE通过使用write-on-write将映射的内存与后备文件分离

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我不能写文件

为什么我可以从cronjob中的Bash脚本创建但不能写入文件?

为什么我不能写USB记忆棒?

为什么我不能写这个缓冲区?

为什么我不能写与同类型箱::新功能?

为什么我不能写两个条件?我该如何解决这个问题?

为什么我不能写一个静态字符串?

为什么我不能写cout << a == b; 但可以写cout <<(a == b);

为什么我不能写到/ dev / stdout,但是php:// stdout可以工作?

Arduino IDE:“没有命名类型”,为什么我不能写这个代码?

为什么我不可能写入到一个文件?

我为什么能写入JSON文件,而不删除其中的所有内容?

Linux,即使拥有组权限也为什么不能写?

为什么console.log不能写提示信息?

为什么我不能写入最后一个块的最后一个字节?

为什么我不能删除文件?

为什么我不能整理文件?

为什么我不能翻译我的js文件?

为什么我不能在 Pycharm 上运行我的文件?

为什么我不能移动我的 Documents 文件夹?

为什么我的 .html 文件不能连接到 .js 文件?

有什么原因我不能写入,然后使用 Pandas 从同一个 csv 文件中读取?

为什么我不能正确安装本地deb文件

为什么我的 crontab 不能使用 /etc/crontab 文件

为什么 Ghostscript 不能识别我修改过的“cidfmap”文件?

php为什么我不能运行批处理文件?

为什么我不能删除此文件?

为什么我的 Excel 文件不能用 PHP 打开?

为什么我不能通过python打开/与文件交互