Как использовать 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.)(