我有一個庫foo.so.每次啓動新程序時,都會使用此庫進行加載。 我想在庫中聲明一個靜態變量,並通過一個程序欄詢問,這個程序欄也使用foo.so庫加載了多少程序(使用這個庫)。我嘗試過靜態和外部,但每次每個程序都將變量初始化爲零(所以當我問酒吧時,它會告訴我它是什麼)。有可能以某種方式得到我想要的結果?使用共享庫計數程序
回答
您將需要使用某種跨進程構造。我在Linux上練習了,但我懷疑shared memory或semaphore將是一個不錯的選擇。既然你不會使用信號量這是正常的目的,它可能看起來有點奇怪,甚至可能停止工作。但我認爲,一個簡單的信號量的方法是做到以下幾點:
負載:sem_open
一個獨特的名字和計數0創建你的信號,或者打開一個已經創建的信號。然後sem_post
增加其值。
檢查:sem_getvalue
讀取存儲在信號量中的當前計數。
上的卸載:sem_wait
(或其嘗試或超時變種之一),以減小信號的計數加sem_close
如果你仔細清理資源。如果您感覺很好,並且可以避免競爭狀況,請撥打sem_unlink
或sem_destroy
以在系統資源全部卸載後釋放系統資源。 (或者你可以嘗試在這些地方打開,處理和關閉信號燈,以避免必須傳遞sem_t
。但是如果系統自動清理了一個信號量不在任何地方打開,這個)
是的,我想過但想象一下,需求發生了變化,我還需要存儲程序的名稱。我將使用某種列表(假設MAXSIZE 100個條目,1個條目= 128個字節)。保留這麼多的共享內存並不是一個好主意。 – user1566277
我想我可以通過將每個程序加載到另一個程序時的信息來做到這一點,但爲此我必須確保該程序是第一個啓動的程序,因此不會錯過任何輸入。但是這個程序仍然需要額外的內存和CPU,所以還是很不理想。 – user1566277
@ user1566277當然,需求的變化可能會導致最佳實施方式的變化(不是shm/sem最適合開始)。您可能還會考慮搜索'/ proc'或類似內容,但除非有快照版本,否則您可能會碰到一些有趣的數據競賽。 –
- 1. 使用共享數據庫開發Android和iPhone應用程序
- 2. iOS/Swift - 使用應用程序組訪問共享數據庫
- 3. 在Windows 8中使用共享數據庫應用程序
- 4. 使用共享庫
- 5. 使用共享庫
- 6. MFC應用程序和共享庫
- 7. 使用共享庫中的錯誤函數的Unix程序
- 8. 數據庫設計共享數據
- 9. 兩個進程使用的共享庫
- 10. 使用git共享遠程倉庫?
- 11. 錯誤從共享數據庫計劃
- 12. Linux,共享庫使用主程序中的函數而不是其他共享庫
- 13. P2p使用IPhone共享應用程序?
- 14. 無法使用今日分機的共享應用程序組共享數據
- 15. 在Web應用程序設計模式之間共享數據庫
- 16. 用於WinRT metro應用程序的共享「本地」數據庫
- 17. 對另一個應用程序使用本機android共享庫
- 18. 打包使用共享庫編譯的qt應用程序
- 19. 在應用程序中使用DI與共享庫
- 20. 在Android應用程序中使用現有的共享庫(.so)
- 21. 共享庫是否與應用程序使用相同的堆?
- 22. 應用程序共享
- 23. android共享應用程序
- 24. 共享庫的插件程序集
- 25. 流C++程序和共享庫
- 26. 共享數據庫
- 27. 在應用程序內共享數據
- 28. 與heroku應用程序共享數據
- 29. 使用共享庫的Linux共享庫未定義符號
- 30. 加載使用其他共享庫的共享庫
您應該將計數器存儲在一個文件中,因爲當庫不被使用(並且操作系統將其殺死)時,庫變量可能會消失。 –
這意味着每次需要閱讀的時候都要寫入每個條目的開始寫入結束和開放閱讀的結束。對於這麼小的任務,這是很多I/O。 – user1566277