繁体   English   中英

malloc()何时设置EAGAIN错误?

[英]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]存储空间不足。

POSIX malloc描述

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM