C语言 malloc()何时设置EAGAIN错误



我阅读了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 description

Solaris来自一个不同的UNIX家族,您将遇到POSIX和基本Solaris之间的许多差异——也就是说,对于新用户来说,最明显的事情通常是awk。Solaris有一个古老的awk:/usr/bin/awk,/usr/xpg/bin/awk更"现代",/usr/bin/awk是在将shell脚本移植到Solaris时使用的。

相关内容

  • 没有找到相关文章

最新更新