2011-07-08 39 views
-1

我有一個動態加載庫來計算一個特殊值。我的程序需要訪問此值(使用C或C++)。 我想過命名管道。但是爲了這個目的他們似乎有些奇怪。如果通過管道實現,我的庫將在文件中寫入一個值,然後,我的程序將讀取它。我讀了一個SIGPIPE信號。爲什麼我需要其中的一個,我必須使用它嗎? 我還讀到,爲了在命名管道中寫入,管道必須打開才能讀取。那是什麼意思? 我計劃通過mkfifo實現一個命名管道。不知何故,在例子中,我也看到不同的調用,有時只是一個文件被創建和打開。爲什麼我不能這樣做?我真的不想有任何阻塞的管道。如何溝通程序和庫之間的一個值(使用mkfifo左右)?

最後,我只想存儲一個值,以便它可以被庫和程序訪問。除了管道之外,還有其他方法可以實現嗎?

我不認爲函數返回值是可能的,因爲庫中的所有函數都是內部調用的,而不是由我的程序(malloc hook)從外部調用的。

+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