使用mmap分配内存

5

我需要分配内存,但是不能使用malloc,因为它不是可重入的,所以我将使用POSIX mmap函数实现动态内存分配。是否可以使用mmap


“可重入”通常被理解为包括所有叶子函数,例如mallocmalloc没有回调机制来调用您的代码,因此无论如何都无法重新进入它(在同一线程上)。任何可重入性都完全在标准库内部并受其控制。 - MSalters
@MSalters:假设他想在信号处理程序中分配内存,那么malloc()不可重入就是一个问题。 - janneb
@janneb:那不是已经被禁止了吗? - MSalters
@MSalters:啊,你说得对;mmap()不是异步信号安全的。我已经相应地更新了我的答案。 - janneb
2个回答

5

是的,mmap()应该是可重入的,因此您应该能够使用它。请注意,mmap()通常是一项相当缓慢的操作,因此您最好仅在真正需要的(希望很少且稀少)情况下使用它,而不是作为通用目的的malloc()替代。

POSIX 2008包含一份异步信号安全函数列表,这些函数可以从信号处理函数中安全调用(请参见链接中第2.4.2节中的表格)。mmap()不在该列表中,也就是说,从信号处理函数中调用mmap()可能会导致未定义的行为。

您可以避免在信号处理程序中分配内存,只需设置一些标志,并稍后执行实际工作即可。


它并不总是有效,例如如果信号处理程序的任务恰好是保存信号数据(以供稍后处理)。由于可重入性,无法使用malloc(),也无法使用堆栈,因为在处理程序返回时会被销毁,这就是OP开始考虑一些不常见的解决方法的原因。 - peterh

1

编辑:将可重入替换为线程安全

在大多数操作系统上,malloc是线程安全的。

您使用的是哪个操作系统?您确定它不是线程安全的吗? 或者您需要它是可重入的(我猜不需要)?


我正在使用glibc,所以我猜它是一个非可重入函数。你觉得我能用malloc吗? - domlao
6
大多数系统中,malloc是线程安全的,但不是可重入的。 - janneb
1
是的,你可以使用glibc的malloc函数。正如janneb所说,它是线程安全的,但不可重入,但我想这正是你所需要的。 - Benoit Thiery
3
@sasayins为什么需要可重入的malloc?如果你只是需要在多个线程中分配内存,那么使用malloc是安全的,因为它是线程安全的。但如果你需要在信号处理程序中分配内存,那就不行了。如果你需要其他东西,请解释清楚。 - nos
@nos 它可能在许多情况下都是必需的,例如信号处理程序,但也可能涉及一些低级中断处理,尽管这主要是内核的事情。这个问题询问是否有可行的解决方法来避免在更低的层次上遇到这个障碍。 - peterh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接