我在我的一个程序中使用mmap()
ed内存。一个问题是mmap()
内存不是\0
- 当它是页面大小的倍数时终止。因此,为了确保它是\0
- 终止,我考虑使用特定于Linux的mremap()
。因此,我在代码中的想法是:
buf = mmap(NULL, oldsize, PROT_READ | PROT_WRITE, MAP_SHARED);
buf = mremap(buf, oldsize, oldsize + 1, MREMAP_MAYMOVE);
我最终会得到一个以空字符结尾的字符串吗?
答案 0 :(得分:1)
正如上面的评论者所说,您可以在调用mmap
时添加1个尺寸,而且不需要mremap()
。
虽然不便携。
在Linux上使用它是非常安全的,因为Linus Torvalds自己曾经在realworldtech网站上的论坛帖子中描述了这个技巧,我无法想象他会很快改变它,因为它会打破很多代码(没有链接到帖子,抱歉,realworldtech论坛无法搜索,该帖子是在6或7年前完成的。)
我确切地知道,自2010版libc
以来,这个技巧在Solaris Sparc上不起作用。我知道,因为当我的系统更新库时,我被那个问题所困扰。
我不得不咬紧牙关并更改所有代码,以便它从未尝试触摸超出文件大小的范围。
Solaris手册页对此毫不含糊地说出来。
mmap()
功能允许[pa, pa + len)
延伸到更远的地方mmap()
和mmap()
时对象的结尾 而映射仍然存在,例如创建文件时 在SIGBUS
电话之前没有任何内容,或者什么时候 文件被截断。 对超出最后的地址的任何引用 但是,对象将导致交付SIGSEGV
或mmap()
信号。无法使用{{1}}函数 隐式地扩展文件的长度。
强调我的。
答案 1 :(得分:0)
你的方法对我不起作用。 "添加" byte会导致段错误。
对于大小为pagesize的倍数的文件,当我mmap
filesize
+ pagesize
个字节的匿名内存然后mmap
时,工作是什么工作
MAP_FIXED
上面的文件。