Как использовать mmap для выделения памяти в куче?

просто вопрос, как я могу использовать mmap() выделить память в куче? Это мой единственный вариант, потому что malloc() не реентерабельная функция.

2 ответов


зачем вам нужна реентерабельность? Единственное время, необходимое для вызова функции из обработчика сигнала; в противном случае потокобезопасность так же хороша. Оба!--2--> и 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 кажется, что-то лучше избегать, это, безусловно, можно сделать.

нет, вы не можете напрямую использовать malloc(). Если вы хотите, чтобы он был в куче, то mmap тоже не будет работать.

мое предложение состоит в том, что вы делаете специальную цель плиты распределителя на основе malloc.

решите, какой именно размер объекта вы хочу и выделить некоторые из них. Сначала выделите их с помощью malloc () и сохраните для одновременного использования позже. Для получения и освобождения этих блоков можно использовать встроенные функции очереди и очереди без очереди. Если ими нужно управлять только из обработчика сигнала, то даже это не обязательно.

проблема решена!


1. И если вы этого не делаете, то кажется, что у вас есть встроенная система или вы можете просто использовать функция malloc.)(