mremap()到\ 0-终止字符串

时间:2015-08-25 18:54:44

标签: c mmap

我在我的一个程序中使用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);

我最终会得到一个以空字符结尾的字符串吗?

2 个答案:

答案 0 :(得分:1)

正如上面的评论者所说,您可以在调用mmap时添加1个尺寸,而且不需要mremap()

虽然不便携。

在Linux上使用它是非常安全的,因为Linus Torvalds自己曾经在realworldtech网站上的论坛帖子中描述了这个技巧,我无法想象他会很快改变它,因为它会打破很多代码(没有链接到帖子,抱歉,realworldtech论坛无法搜索,该帖子是在6或7年前完成的。)

我确切地知道,自2010版libc以来,这个技巧在Solaris Sparc上不起作用。我知道,因为当我的系统更新库时,我被那个问题所困扰。 我不得不咬紧牙关并更改所有代码,以便它从未尝试触摸超出文件大小的范围。 Solaris手册页对此毫不含糊地说出来。

  

mmap()功能允许[pa, pa + len)延伸到更远的地方        mmap()mmap()时对象的结尾        而映射仍然存在,例如创建文件时        在SIGBUS电话之前没有任何内容,或者什么时候        文件被截断。 对超出最后的地址的任何引用        但是,对象将导致交付        SIGSEGVmmap()信号。无法使用{{1}}函数        隐式地扩展文件的长度。

强调我的。

答案 1 :(得分:0)

你的方法对我不起作用。 "添加" byte会导致段错误。

对于大小为pagesize的倍数的文件,当我mmap filesize + pagesize个字节的匿名内存然后mmap时,工作是什么工作 MAP_FIXED上面的文件。