2012-01-29 17 views
4

私はWindowsからLinuxへのいくつかのアプリのポートに必要な、彼らは、共有メモリとセマフォを使用しています。私は、CreateFileMapping/OpenFileMappingやCreateSemaphore/OpenSemaphoreなどのWinddows関数を置き換える必要があります。私は後でセマフォーと共有メモリーのための共通インターフェースを書きます。 WindowsではUnix IPCリソースを自動的に削除するには?

すべてのハンドルが閉じられたときに、リソース(セマフォまたは共有メモリ)は、システムによって削除されます。しかし、Unixでは、shm_unlink(共有メモリはshm_openでオープン)とsem_unlink(sem_openでオープンしたセマフォ)でリソースを削除する必要があります。 shm_openはディスク上に実際のファイルを作成しないので良いです。それは代わりに、文字列の識別子として数を必要とするため

私はたshmgetを使用することはできません。 ftokは、衝突を生成する可能性があるため、まったく役に立たない。

新しいプロセスがそれを必要としませんとき、それはわからない、とプロセスがクラッシュしたり、手動でユーザーによって殺される可能性があるため、すべてのハンドルが閉じられて前に私は* _unlinkを呼び出すことはできません。

これらのリンクを解除してもシステムにゴミが残ってしまい、プロセスグループを再開すると、リソースが他のプロセスで使用されているか古いか(リンクされていないユーザーがプロセスを強制終了した、またはプロセスがクラッシュした)

答えて

1

私の知る限りでは、自動削除のSysVスタイルのIPCを処理するためには実際のポータブルな方法をtheresの。

1つのオプションは、共有mem/semaphoreリソースを管理/所有するタスクだけである監督デーモンプロセスを作成することです。いくつかのOSで動作するトリックは、そのプロセスに共有メモリを削除済みとしてマークし、すべてのハンドルが閉じられたときにOSが実行するようにすることです。一部のOSの新しいプロセスがマークされた領域にアタッチしようとすると、EINVAL/EACCESSが返されるため、これは移植性がありません。

あなたの起動スクリプトは、既知の良好な状態にシステムをもたらすために任意の孤立したリソースをクリーンアップする可能性があります。あなたのシステムのuidが所有するものは、 "ipcs | xargs ipcrm"タイプのものを削除する候補になります。確かにあなたは失敗/倒れても孤立していますが、誰が気にしていますか?

関連する問題