我在Solaris上阅读了malloc()
上的手册,发现malloc()
可能在Solaris中设置EAGAIN
错误。
手册写道:
EAGAIN没有足够的内存可用于分配大小字节的内存;但应用程序可以稍后再试。
就个人而言,我认为如果malloc()
返回NULL
,则必须存在内存泄漏或其他一些持久性问题。如果发生这种情况,以后会再次尝试帮助吗?
所以我想知道,malloc()
设置EAGAIN
errno的条件是什么?有谁遇到过这种情况?
答案 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]存储空间不足。
Solaris来自不同的UNIX系列,您将在POSIX和基础Solaris之间遇到很多差异 - 即,新用户最明显的事情通常是awk。 Solaris有一个古老的awk:/ usr / bin / awk,/ usr / xpg / bin / awk更“现代”,/ usr / bin / nawk是将shell脚本移植到Solaris时使用的。这些不合时宜的东西已经过时了,所以旧的实用程序和系统调用将在新版本的Solaris上保持正常运行。