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

首先,我创建一个文件并向其回显一些字符,然后对其显示的文件进行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函数和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
仅读取。