共有ライブラリを使用するアプリケーションに応じて異なるメモリ管理ルーチンを使用するように、既存の共有ライブラリを変更します。C共有ライブラリ:静的変数の初期化+プロセス間のグローバル変数の可視性
2人のメモリ管理ルーチンの家族があるでしょう(今のところ):
- 標準のmalloc、のcallocなどが
私が来たのmallocの
これは私が修正を実装するつもり方法です:
は、malloc関数/のcallocなどの既存のコールを交換/ my_callocなどmy_mallocでこれらの新機能は、代わりにハードコーディングされた関数を呼び出した正しく割り当て関数ポインタを呼び出します名前。
標準のCメモリ管理ルーチンを指すように、共有ライブラリがmy_mallocなどで使用する関数ポインタを初期化するメカニズムを提供します。これにより、この共有ライブラリに依存するアプリケーションに下位互換性を提供することができます。同様に変更する必要があります。 C言語では、静的な変数の初期化を使用してこれを行うことができました。 - 同じ 'パターン'をC言語で使用できるかどうか不明です。
新しい冪等関数initAPI(タイプ)関数を導入しました。これは、アプリケーションによって呼び出される(起動時に)、共有ライブラリで異なるmem mgmtルーチンを使用する必要があります。 initAPI()関数はメモリmgmt func ptrsを適切な関数に代入します。例えば、関数はAPIコールがライブラリに行われた後に呼び出さないでください - - このように私はinitAPI()、または、それが呼び出されたときに呼び出すことができる人を制限することができれば
明らかに、それが望ましいだろうメモリー管理ルーチンが変更されます。ですから、私はそれがどこで誰によって呼び出されるかを制限したいと思います。これは、C++でメソッドを非公開にすることで解決できるアクセス上の問題です.Cでこれを行う方法がわかりません。
上記の2と3の問題は、C++では簡単に解決できますが、 C言語での問題を解決するには、C言語でこれらの問題を解決したいと思います。
最後に、前述のように関数ポインタを正しく初期化することができると仮定します。共有ライブラリを使用して異なるプロセス間で共有することができます。関数ポインタはグローバル変数として実装されます(私はあまりにもスレッドの安全性を心配していません - ある時点でmutexロックでアクセスをラップすることも考えています)*共有ライブラリを使用する各アプリケーションはメモリ管理ルーチンを妨害すべきではありません共有ライブラリを使用する別のアプリケーションで使用されます。
私はshlibを使ってプロセス間で共有されるコード(データではない)だと思っていますが、私はそれを確認したいと思います - 好ましくはそのアサーションをバックアップするリンクを付けてください。
注:上記の「アーキテクチャ」の結果として今後発生する可能性のあるスレッド問題を軽視すると、誰かが私に警告してくれます!
ところで、私は具体的な質問がないためにLinuxの(Ubuntuの)上のライブラリ
"これは** money ** mgmtルーチンを変更します" ...あなたはもっと気をつけてください:-) – pmg
@pmg:Oh snap !. Freudian slip there :) –
ちょうど説明:これはLinux固有の質問ですか? – Asaf