malloc()何时设置EAGAIN错误?

时间:2013-06-04 08:01:01

标签: c malloc solaris

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

手册写道:

  

EAGAIN没有足够的内存可用于分配大小字节的内存;但应用程序可以稍后再试。

就个人而言,我认为如果malloc()返回NULL,则必须存在内存泄漏或其他一些持久性问题。如果发生这种情况,以后会再次尝试帮助吗?

所以我想知道,malloc()设置EAGAIN errno的条件是什么?有谁遇到过这种情况?

3 个答案:

答案 0 :(得分:2)

标准malloc()未在失败时将错误号设置为EAGAIN

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

一般来说,错误EAGAIN表示Resource temporarily unavailable。这意味着操作系统可能会在一段时间内获得资源。

这只是一种说法现在我没有足够的记忆,但我会尝试在最近的将来释放一些,然后我可以把它给你

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

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

我建议您在收到sleep()后再使用EAGAIN,然后重新尝试。第二次调用后,将分配内存或返回另一个错误。如果它是ENOMEM,那么情况很清楚,没有记忆。如果它再次EAGAIN ......这取决于你。

答案 1 :(得分:0)

标准malloc函数在失败时未设置errno。因此,它仅适用于具有此附加功能的Solaris上的implementation of malloc。 请注意,malloc 仍然在失败时返回NULL。

因此,你仍然可以检查malloc()的返回值,而不是检查errno这是标准的malloc的行为,并且应该在所有场合都足够了。只是errno提供了有关失败的其他信息,这些信息在某些情况下可能会有所帮助。

一般来说,检查errno只有返回代码才有意义。依赖errno可能会或可能不会表示任何失败。

答案 2 :(得分:0)

opengroup.org(POSIX)说:

  

成功完成后,size不等于0,malloc()将返回指向已分配空间的指针。如果size为0,则返回空指针或可成功传递给free()的唯一指针。否则,它将返回空指针[CX]并设置errno以指示错误。

     

错误

     

如果出现以下情况,malloc()函数将失败:

     

[ENOMEM]

     

[CX]存储空间不足。

POSIX malloc description

Solaris来自不同的UNIX系列,您将在POSIX和基础Solaris之间遇到很多差异 - 即,新用户最明显的事情通常是awk。 Solaris有一个古老的awk:/ usr / bin / awk,/ usr / xpg / bin / awk更“现代”,/ usr / bin / nawk是将shell脚本移植到Solaris时使用的。这些不合时宜的东西已经过时了,所以旧的实用程序和系统调用将在新版本的Solaris上保持正常运行。