4

Solaris でマニュアルを読んだところ、Solaris でエラーを設定できることがmalloc()わかりました。malloc()EAGAIN

マニュアルには次のように書かれています。

EAGAIN size バイトのメモリを割り当てるのに十分なメモリがありません。ただし、アプリケーションは後で再試行できます。

malloc()個人的には、 が返された場合NULL、メモリ リークまたはその他の永続的な問題が発生しているに違いないと思います。その場合、後で再試行するとどのように役立ちますか?

だから私は知りたいのですが、どのような条件でerrnoをmalloc()設定できますか? EAGAIN誰もそのような状況に遭遇しましたか?

4

3 に答える 3

2

標準は、失敗時にmalloc()errno を設定しません。EAGAIN

Unix では、malloc()おそらく errno を に設定しますENOMEM

一般に errnoEAGAINは を意味しResource temporarily unavailableます。これは、オペレーティング システムがリソースを利用できるようになる可能性があることを意味します。

これは、今は十分なメモリがないと言っているだけですが、近いうちにいくつかを解放して、あなたに渡すことができます.

これは、オペレーティング システムが通常プロセスにメモリを割り当てる方法に関連している可能性があります。メモリがfree()'dオペレーティング システムに返されず、そのプロセス用に予約されている場合でも同様です。

私は推測しているだけですが、おそらくEAGAINシステムの場合、他のプロセスに割り当てられた未使用のメモリを再割り当てしようとします。これには時間がかかる場合があるため、EAGAIN戻りコードが返されます。

sleep()受け取っEAGAINてからもう一度試してみることをお勧めします。2 回目の呼び出しの後、メモリが割り当てられるか、別のエラーが返されます。の場合ENOMEM、ケースはクリアです。メモリはありません。それがまたある場合EAGAIN...それはあなた次第です。

于 2013-06-04T08:25:54.637 に答える
0

opengroup.org (POSIX) は次のように述べています。

0 以外のサイズで正常に完了すると、malloc() は割り当てられたスペースへのポインターを返します。size が 0 の場合、null ポインターまたは free() に正常に渡すことができる一意のポインターのいずれかが返されます。それ以外の場合は、null ポインター [CX] を返し、エラーを示すために errno を設定します。

エラー

次の場合、malloc() 関数は失敗します。

[エノメム]

[CX] ストレージ容量が不足しています。

POSIX malloc の説明

Solaris は別の UNIX ファミリに属しており、POSIX とベースの Solaris の間には多くの違いがあります。つまり、新しいユーザーにとって最も明白なのは通常 awk です。Solaris には古い awk があります: /usr/bin/awk、/usr/xpg/bin/awk はより「モダン」、/usr/bin/nawk はシェル スクリプトを Solaris に移植するときに使用するものです。これらのアナクロニズムは昔からあり、新しいバージョンの Solaris で古いユーティリティとシステムコールが引き続き機能するようになっています。

于 2013-06-04T11:38:49.427 に答える