2014-06-05 44 views
4

我有一個庫foo.so.每次啓動新程序時,都會使用此庫進行加載。 我想在庫中聲明一個靜態變量,並通過一個程序欄詢問,這個程序欄也使用foo.so庫加載了多少程序(使用這個庫)。我嘗試過靜態和外部,但每次每個程序都將變量初始化爲零(所以當我問酒吧時,它會告訴我它是什麼)。有可能以某種方式得到我想要的結果?使用共享庫計數程序

+0

您應該將計數器存儲在一個文件中,因爲當庫不被使用(並且操作系統將其殺死)時,庫變量可能會消失。 –

+0

這意味着每次需要閱讀的時候都要寫入每個條目的開始寫入結束和開放閱讀的結束。對於這麼小的任務,這是很多I/O。 – user1566277

回答

1

您將需要使用某種跨進程構造。我在Linux上練習了,但我懷疑shared memorysemaphore將是一個不錯的選擇。既然你不會使用信號量這是正常的目的,它可能看起來有點奇怪,甚至可能停止工作。但我認爲,一個簡單的信號量的方法是做到以下幾點:

負載:sem_open一個獨特的名字和計數0創建你的信號,或者打開一個已經創建的信號。然後sem_post增加其值。

檢查:sem_getvalue讀取存儲在信號量中的當前計數。

上的卸載:sem_wait(或其嘗試或超時變種之一),以減小信號的計數加sem_close如果你仔細清理資源。如果您感覺很好,並且可以避免競爭狀況,請撥打sem_unlinksem_destroy以在系統資源全部卸載後釋放系統資源。 (或者你可以嘗試在這些地方打開,處理和關閉信號燈,以避免必須傳遞sem_t。但是如果系統自動清理了一個信號量不在任何地方打開,這個)

+0

是的,我想過但想象一下,需求發生了變化,我還需要存儲程序的名稱。我將使用某種列表(假設MAXSIZE 100個條目,1個條目= 128個字節)。保留這麼多的共享內存並不是一個好主意。 – user1566277

+0

我想我可以通過將每個程序加載到另一個程序時的信息來做到這一點,但爲此我必須確保該程序是第一個啓動的程序,因此不會錯過任何輸入。但是這個程序仍然需要額外的內存和CPU,所以還是很不理想。 – user1566277

+0

@ user1566277當然,需求的變化可能會導致最佳實施方式的變化(不是shm/sem最適合開始)。您可能還會考慮搜索'/ proc'或類似內容,但除非有快照版本,否則您可能會碰到一些有趣的數據競賽。 –