Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用mmap分配内存_C_Posix_Mmap - Fatal编程技术网

C 使用mmap分配内存

C 使用mmap分配内存,c,posix,mmap,C,Posix,Mmap,我需要分配内存,但不能使用malloc,因为它不可重入,所以基本上我将使用POSIXmmap函数实现动态内存分配。是否可以使用mmap?编辑:将可重入替换为线程安全 malloc在大多数操作系统上都是线程安全的 您使用的是哪一个?您确定它不是线程安全的吗? 或者您需要它是可重入的(我想不是)?是的,mmap()应该是可重入的,所以您应该能够使用它。请注意,mmap()通常是一个非常缓慢的操作,因此您最好只在(希望)极少数和极少数真正需要它的情况下使用它,而不是将其作为一般用途的malloc()替

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

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

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

您使用的是哪一个?您确定它不是线程安全的吗? 或者您需要它是可重入的(我想不是)?

是的,mmap()应该是可重入的,所以您应该能够使用它。请注意,mmap()通常是一个非常缓慢的操作,因此您最好只在(希望)极少数和极少数真正需要它的情况下使用它,而不是将其作为一般用途的malloc()替换

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


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

我在glibc中使用,因此我猜这是一个不可重入的函数。你认为我可以使用malloc吗?在今天的大多数系统上,malloc是线程安全的,但不是可重入的。是的,你可以使用glibc-malloc。正如janneb所说,它是线程安全的,不可重入的,但我想这正是您所需要的。@sasayins为什么需要重入的malloc?如果您只需要在多个线程中分配内存,就可以了。malloc是线程安全的。如果需要在信号处理程序中分配内存,则不能这样做。如果您还需要其他东西,请解释。@nos可能需要它的原因有很多,例如信号处理程序,但也可以进行一些低级中断处理,尽管它主要是内核的东西。此问题要求在较低级别上避免此障碍的变通方法的可行性。“可重入”通常被理解为包括所有叶函数,如
malloc
malloc
没有对代码的回调机制,因此无法(在同一线程上)重新输入代码。任何可重入性都将完全在标准库内部并受其控制。@MSalters:他可能想在信号处理程序中分配内存,在这种情况下,malloc()不可重入是一个问题。@janneb:这不是被禁止的吗?@MSalters:啊,你说得对;mmap()不是异步信号安全的。我已经相应地更新了我的答案。它并不总是有效的,例如,如果信号处理程序的任务就是保存信号数据(供以后处理)。malloc()由于可重入性而无法使用,堆栈也无法使用,因为它将在处理程序返回时被销毁,OP就是这样开始考虑一些不常见的解决方法的。