mremap() 以 \0 终止一个字符串

mremap() to \0-terminate a string

我在我的一个程序中使用 mmap()ed 内存。一个问题是 mmap()ed 内存在页面大小的倍数时不会 [=13=] 终止。因此,为了确保它是 [=13=] 终止的,我考虑使用 Linux 特定的 mremap()。因此,我的代码想法是:

buf = mmap(NULL, oldsize, PROT_READ | PROT_WRITE, MAP_SHARED);
buf = mremap(buf, oldsize, oldsize + 1, MREMAP_MAYMOVE);

我会得到一个以 null 结尾的字符串吗?

正如上面的评论者所说,您可以在调用mmap时将大小加1,而无需mremap()

虽然它不是便携式的。

在 Linux 上,使用它是相当安全的,因为 Linus Torvalds 自己曾经在 realworldtech 网站的论坛 post 中描述过这个技巧,我无法想象他会很快改变它,因为它会破坏很多代码(没有 link 到 post,抱歉,realworldtech 的论坛不可搜索,post 是 6 或 7 年前完成的)。

我很确定,自从 libc 的 2010 版本以来,这个技巧在 Solaris Sparc 上不起作用。我知道这一点,因为在我们系统上更新库的那段时间,我被那个问题弄得焦头烂额。 我不得不硬着头皮更改我们所有的代码,以便它永远不会尝试超出文件大小。 Solaris 手册页明确说明了这一点。

The mmap() function allows [pa, pa + len) to extend beyond the end of the object both at the time of the mmap() and while the mapping persists, such as when the file is created prior to the mmap() call and has no contents, or when the file is truncated. Any reference to addresses beyond the end of the object, however, will result in the delivery of a SIGBUS or SIGSEGV signal. The mmap() function cannot be used to implicitly extend the length of files.

强调我的。

你的方法对我不起作用。 "added" 字节导致段错误。

什么时候起作用,对于大小是页面大小的倍数的文件,我 mmap filesize+pagesize 字节的匿名内存然后 mmapMAP_FIXED 覆盖它的文件。