只是提出的问题,如何使用mmap()
在堆中分配内存?这是我唯一的选择,因为malloc()
不是可重入函数。
答案 0 :(得分:22)
为什么需要重入?唯一需要的是从信号处理程序调用函数;否则,线程安全性也一样好。 malloc
和mmap
都是线程安全的。每个POSIX都不是异步信号安全的。在实践中,mmap
可能在信号处理程序中工作正常,但是从信号处理程序分配内存的整个想法是一个非常糟糕的主意。
如果你想使用mmap
来分配匿名内存,你可以使用(不是100%便携但绝对是最好的):
p = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
便携但丑陋的版本是:
int fd = open("/dev/zero", O_RDWR);
p = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
close(fd);
请注意,MAP_FAILED
而非NULL
是失败的代码。
答案 1 :(得分:9)
虽然在信号处理程序 1 中分配内存确实是最好避免的,但肯定可以做到。
不,你不能直接使用malloc()。如果你想让它在堆中,那么mmap也不会工作。
我的建议是你根据malloc创建了一个特殊用途的slab allocator。
确定您想要的对象大小,并预先分配一些对象。最初使用malloc()分配它们并保存它们以便以后同时使用。您可以使用本质上可重入的队列和取消队列函数来获取和释放这些块。如果他们只需要从信号处理程序进行管理,那么即使这样也没有必要。
问题解决了!
1。如果您没有这样做,那么您似乎拥有嵌入式系统或者只能使用malloc()。