我阅读了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时使用的。