gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:36:37 26 4
gpt4 key购买 nike

我在我的一个程序中使用了 mmap()ed 内存。一个问题是 mmap()ed 内存不是 \0 终止的(当它是页面大小的倍数时)。因此,为了确保它是 \0 终止的,我考虑使用 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 网站的一篇论坛帖子中描述过这个技巧,我无法想象他会很快改变它,因为它会破坏很多代码(没有链接到帖子,抱歉,realworldtech 的论坛不可搜索,该帖子是 6 或 7 年前完成的)。

我很确定,自 2010 版 libc 以来,此技巧在 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.

强调我的。

关于c - mremap() 到\0-终止一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32211879/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com