[英]When does malloc() set EAGAIN error?
我在Solaris上阅读了关于malloc()
的手册,发现malloc()
可以在Solaris中设置EAGAIN
错误。
手册写道:
EAGAIN没有足够的内存可用于分配大小字节的内存; 但应用程序可以稍后再试。
就个人而言,我认为如果malloc()
返回NULL
,则必须存在内存泄漏或其他一些持久性问题。 如果发生这种情况将如何再次尝试帮助?
所以我想知道,在什么条件下malloc()
设置EAGAIN
errno? 有谁遇到过这样的情况?
标准malloc()
在失败时不会将errno设置为EAGAIN
。
在Unix下, malloc()
很可能将errno设置为ENOMEM
。
通常,errno EAGAIN
表示Resource temporarily unavailable
。 这意味着操作系统可能在一段时间内拥有可用资源。
这只是一种说法, 我现在没有足够的记忆,但我会尝试在最近的将来释放一些,然后我可以给你 。
这可能与操作系统通常为进程分配内存的方式有关 - 即使内存是free()'d
它也不会返回到操作系统,但仍然为该进程保留。
我只是推测 ,但是在EAGAIN
的情况下,系统将尝试重新分配分配给其他进程的未使用的内存。 这可能需要一些时间,因此EAGAIN
返回代码。
我建议在收到EAGAIN
后再使用sleep()
,然后重新尝试。 第二次调用后,将分配内存或返回另一个错误。 如果它是ENOMEM
,那么情况很清楚,没有记忆。 如果它再次成为EAGAIN
......这取决于你。
标准malloc函数在失败时不设置errno
。 因此,它仅适用于具有此附加功能的Solaris上的malloc实现 。 请注意,malloc在失败时仍返回NULL。
所以你仍然可以检查malloc()的返回值,而不是检查errno
,这是标准的malloc的行为,并且应该在所有场合都足够了。 只是errno
提供了有关失败的其他信息,这些信息在某些情况下可能会有所帮助。
一般来说,检查errno
只有返回代码才有意义。 依赖errno
可能会也可能不会表示任何失败。
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上保持正常运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.