4

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

手册写道:

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

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

所以我想知道,在什么条件下可以malloc()设置EAGAINerrno?有没有人遇到过这样的情况?

4

3 回答 3

2

标准malloc()不会将 errno 设置为EAGAIN失败。

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

一般来说 errno的EAGAIN意思是Resource temporarily unavailable. 这意味着操作系统可能在一段时间内拥有可用的资源。

这只是一种说法,我现在没有足够的内存,但我会在不久的将来尝试释放一些,然后我可以给你

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

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

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

于 2013-06-04T08:25:54.637 回答
0

opengroup.org (POSIX) 说:

在大小不等于 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 上仍然有效。

于 2013-06-04T11:38:49.427 回答
0

标准 malloc 函数不会errno在失败时设置。因此,它仅特定于 具有此附加功能的 Solaris 上的 malloc 实现。请注意,malloc在失败时仍然返回 NULL。

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

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

于 2013-06-04T08:16:06.980 回答