我在 Solaris 上阅读了手册malloc()
,发现malloc()
可以在 Solaris 中设置EAGAIN
错误。
手册写道:
EAGAIN 没有足够的内存来分配 size 字节的内存;但该应用程序可以稍后再试。
就个人而言,我认为如果malloc()
返回NULL
,一定是内存泄漏或其他一些持久性问题。如果发生这种情况,以后再试一次会有什么帮助?
所以我想知道,在什么条件下可以malloc()
设置EAGAIN
errno?有没有人遇到过这样的情况?
标准malloc()
不会将 errno 设置为EAGAIN
失败。
在 Unix 下,malloc()
很可能会将 errno 设置为ENOMEM
.
一般来说 errno的EAGAIN
意思是Resource temporarily unavailable
. 这意味着操作系统可能在一段时间内拥有可用的资源。
这只是一种说法,我现在没有足够的内存,但我会在不久的将来尝试释放一些,然后我可以给你。
这可能与操作系统通常为进程分配内存的方式有关——即使内存free()'d
没有返回给操作系统,但仍为该进程保留。
我只是推测,但也许EAGAIN
系统会尝试重新分配分配给其他进程的未使用内存。这可能需要时间,因此EAGAIN
返回代码。
我建议sleep()
收到后使用EAGAIN
,然后再试一次。在第二次调用之后,要么分配内存,要么返回另一个错误。如果是ENOMEM
,那么情况就很清楚了,没有记忆。如果它EAGAIN
再次......这取决于你。
opengroup.org (POSIX) 说:
在大小不等于 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 上仍然有效。
标准 malloc 函数不会errno
在失败时设置。因此,它仅特定于 具有此附加功能的 Solaris 上的 malloc 实现。请注意,malloc在失败时仍然返回 NULL。
因此,您仍然可以检查 malloc() 的返回值,而无需检查errno
哪个是标准 malloc 的行为,并且在所有情况下都应该足够了。只是errno
提供了有关失败的附加信息,这在某些情况下可能会有所帮助。
一般来说,检查errno
只有与返回码一起才有意义。依赖errno
可能表示也可能不表示任何失败。