2010-11-25 15 views
3

私は、IPCと共有メモリを中心とした大学の割り当てに取り組んでいます。問題は、Cの完全な騒ぎのように、私は何時間も私のアプリ(明らかにshmgetshmatを使用しています)を喜んでテストしています。あなたはおそらく推測することができますが、私は自分自身の後にきれいにされていないし、私はshmgetがもうリソースを割り当てることができないと仮定しているので、私は私のアプリを実行することはできません。OSXのCで共有メモリを管理する

私の質問は:OSXを再起動せずにこのリソースを元に戻すにはどうしたらいいですか?GUIツールや、作成しているこの共有メモリを監視/管理するために使用できるものはありますか?

答えて

1

参照を保持する各プロセスの共有メモリセグメント上でshmdt( "共有メモリデタッチ")を呼び出します。 Unix共有メモリセクションは参照カウントされるので、最後のプロセスがそれらから切り離されると、shmctl(id, IPC_RMID, NULL)で破壊される可能性があります。

for (int id=0; id < INT_MAX; id++) 
    shmctl(id, IPC_RMID, NULL); 

が、これは恐ろしく非効率的なその場しのぎです:アプリケーションの外部から

は、共有メモリ・セグメントをクリアする私は今考えることができる唯一のオプションです。 (私はそれが動作するかどうかも分かりませんが、それはLinuxではありませんが、LinuxはUNIX標準に違反していますが、MacOS Xはそれに対して認証されています)。

+0

これは実際には本当に便利ですが、それでもやっていないのであれば、ターミナルなどで共有メモリをすべて解放できますか? – Ash

+0

私はこれを行うべきであるコードスニペットでアップデートを投稿しました。私はMacOS Xのボックスではないので、私はあなたのためにこれを行うコマンドを確認することはできません。 'man shmget'などを試してみて、' SEE ALSO'セクションを見てください。 –

+0

ok rad、ありがとうございます。あなたの提案については、 'shmdt(shm_id);を呼び出すときに私の使用法を訂正しています.shm_idは、もともと' shmget() 'を呼び出したときのintです。もし私がプロセスをフォークしたら、shmgetリファレンスもクローン化されます(フォークされたプロセスが 'shmdt()'を呼び出すとOSはもう一方からメモリを破壊しません) – Ash

3

おそらく少し遅いですが、まさにこれ。 ipcsとipcrm

それぞれのマニュアルページをご覧ください。

関連する問題