2011-07-08 5 views
-1

私は1つの特別な値を計算する動的にロードされたライブラリを持っています。私のプログラムはこの値にアクセスする必要があります(CまたはC++)。 名前付きパイプについて考えました。しかし、彼らは何とかこの目的のために奇妙に見えます。パイプで実現されている場合、私のライブラリはファイルに1つの値を書き込み、後で私のプログラムはそれを読み込みます。私はSIGPIPEシグナルについて読んだ。なぜ私はそれらの1つが必要なのですか?それを使用する必要がありますか? 名前付きパイプに書き込むためには、パイプを読み込み用に開く必要があります。それはどこですか? mkfifoで名前付きパイプを実現する予定でした。どういうわけか、例では、私はまた別の呼び出しを参照して、時にはファイルが作成され、開かれます。なぜ私はこれをしないのですか?私は本当にブロックされたパイプを持っていたくない。プログラムとライブラリの間で1つの値を通信する方法(mkfifoなどを使用しています)?

最後に、ライブラリとプログラムによってアクセスできるように1つの値を保存したいだけです。これを実現するにはパイプ以外の方法がありますか?

私のプログラム(mallocフック)ではライブラリのすべての関数が内部で呼び出され、外部からは呼び出されないので、関数の戻り値は考えられません。

+6

たぶん、関数の引数と戻り値? – Nemo

+0

+1からNemo。なぜあなたはそのコメントを答えにしませんでしたか? –

+0

@R:それはあまりにも明白に思えたので... – Nemo

答えて

2

あなたのプログラムが主にmallocフック(LD_PRELOAD経由で読み込んでいて、私は推測していますか?)でも、そこからシンボルにアクセスできます。図書館で、そしてあなたのメインプログラムで(たとえば、getMyValue())関数を定義し、リンク-ldlなど、何かの操作を行います。

void *vpGetMyValue = dlsym(RTLD_DEFAULT, "getMyValue"); 
if (!vpGetMyValue) { 
    // Library not loaded! Do something else 
} 

int (*pGetMyValue)() = (int(*)())vpGetMyValue; 
int myValue = pGetMyValue(); 
+0

もちろん、ライブラリによってエクスポートされたシンボルに対してのみ動作します。しかし、質問者がライブラリを制御するので、うまくいくはずです... – Nemo

+0

この回答に感謝します。輸出されたシンボルはどういう意味ですか? – Shan

+0

エクスポートされたシンボルは、ライブラリ内で定義された変数または関数であり、そのライブラリを使用しているプログラムから参照できます。 Linuxでは、デフォルトでは、すべての非静的変数と関数がエクスポートされます(注:C++では、名前のマングリングを防ぐために 'extern" C "'を使用します)。 – bdonlan

関連する問題