C 为什么可以';我不能把它写入文件吗
首先,我创建一个文件并向其回显一些字符,然后对其显示的文件进行cat: sasdfasdfas asfdasfsadf 然后在C程序中,我用以下命令打开文件:C 为什么可以';我不能把它写入文件吗,c,mmap,memory-mapped-files,C,Mmap,Memory Mapped Files,首先,我创建一个文件并向其回显一些字符,然后对其显示的文件进行cat: sasdfasdfas asfdasfsadf 然后在C程序中,我用以下命令打开文件: int fd=open("file",O_RDWR); 使用以下命令创建文件: unsigned char *addr=mmap(NULL,length,PROT_WRITE,MAP_PRIVATE,fd,pa_offset); 其中,length是一个int,约为fstat获取的文件大小,pa_offset为0 open函数和mma
int fd=open("file",O_RDWR);
使用以下命令创建文件:
unsigned char *addr=mmap(NULL,length,PROT_WRITE,MAP_PRIVATE,fd,pa_offset);
其中,length是一个int,约为fstat获取的文件大小,pa_offset为0
open函数和mmap函数都返回得很好,也就是说,open函数返回一个正整数,如3,mmap函数返回一个正确的地址,如0x7fd36999d000
我从地址读了文件,一切正常。当我向它写入时,当我在程序中打印内存时,它似乎成功地写入,但如果我对它进行cat,实际的文件内容不会改变
我尝试了一些方法,比如使用msync(),但都得到了相同的结果
你们谁能告诉我在哪里绊倒的?我只想从mmap-写入您想要的
MAP\u SHARED
文件,而不是MAP\u PRIVATE
unsigned char *addr=mmap(NULL,length,PROT_WRITE,MAP_PRIVATE,fd,pa_offset);
↑↑↑↑↑↑↑↑↑↑↑
从(我的)重点:
MAP\u PRIVATE
-
这指定永远不应执行对区域的写入操作
回写到附加文件。而是为
进程,如果内存不足,该区域将正常交换。
没有其他进程会看到这些更改
MAP\u共享
-
这指定将写入对区域的写入
返回文件。所做的更改将立即与其他用户共享
处理对同一文件的MMA。
请注意,实际写作可能随时进行。你需要使用
msync
,如下所述,如果其他进程使用
常规I/O可以获得文件的一致视图
看
换句话说,
MAP\u PRIVATE
通过使用将映射内存与备份文件分离。仅仅因为x86没有写入权限而没有读取权限并不意味着您应该从内存mmap()ed
仅读取。