c - malloc() 何时设置 EAGAIN 错误?

标签 c malloc solaris

我在 malloc() 上阅读了手册在 Solaris 中,发现 malloc()可以设置EAGAIN Solaris 中的错误。

手册写道:

EAGAIN There is not enough memory available to allocate size bytes of memory; but the application could try again later.



我个人认为如果malloc()返回 NULL ,一定存在内存泄漏或其他一些持续存在的问题。如果发生这种情况,稍后再试会有什么帮助?

所以我想知道,在什么情况下可以malloc()套装EAGAIN错了吗?有没有人遇到过这样的情况?

最佳答案

标准malloc()未将 errno 设置为 EAGAIN失败。

在 Unix 下,malloc()很可能将 errno 设置为 ENOMEM .

一般错误号 EAGAIN意味着 Resource temporarily unavailable .这意味着操作系统可能会在一段时间内拥有可用资源。

这只是一种说法,我现在没有足够的内存,但我会在不久的将来尝试释放一些,然后我可以把它给你。

这可能与操作系统通常为进程分配内存的方式有关——即使内存是free()'d它不会返回到操作系统,但仍为该进程保留。

我只是推测,但也许在 EAGAIN 的情况下系统将尝试重新分配分配给其他进程的未使用内存。这可能需要时间,因此 EAGAIN返回码。

我建议使用 sleep()收到后EAGAIN然后再试一次。在第二次调用之后,要么分配内存,要么返回另一个错误。如果是 ENOMEM ,那么案子就清楚了,没有内存了。如果是 EAGAIN再次......这取决于你。

关于c - malloc() 何时设置 EAGAIN 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16912619/

相关文章:

c - return (a || b) 实用程序?

c - unix 中的轮询功能

c - 链接中 undefined reference 错误

c++ - 使用 c 中结构的 malloc 对内存块进行索引

clock_gettime() undefined symbol SunOS

c - 在c中使用ptrace从另一个进程读取一 block 内存

C、free() 上的内存损坏(快速)错误

c - 动态字符缓冲区 C

java - 即使 java 进程正在运行,jps 也不会返回任何输出

Node.JS 关闭钩子(Hook)