我們的應用程序依賴於外部,第三方提供的配置(包括自定義驅動/決策功能),可加載的.so文件。如何在共享內存中得到共享對象
獨立地,它使用共享存儲器,其中幾乎所有的揮發性狀態被保持的組塊的外部CGI模塊,從而使外部模塊可以讀取它並修改它適用配合。
問題是CGI模塊還需要很多來自.so的永久配置數據,而主應用程序在兩個存儲區之間執行了大量完全不必要的複製操作以使數據可用。這個想法是讓整個共享對象加載到共享內存中,並使其直接可用於CGI。問題是:如何?
- dlopen和dlsym不提供任何設備來指定加載SO文件的位置。
- 我們試過shmat()。它似乎只在某些外部CGI實際嘗試訪問共享內存之前起作用。然後,指向的區域就像私密,就好像它從未共享一樣。也許我們做錯了什麼?
- 在需要它的每個腳本中加載.so都是沒有問題的。結構的龐大規模與呼叫頻率相關(某些腳本每秒調用一次以生成實時更新),而這是一個嵌入式應用程序,它使其不起作用。
- memcpy()將.so放入shm中也不好 - 某些結構和所有函數通過指針相互關聯。
雖然它不直接回答我的問題,但我猜這是最接近它。我還沒有看到一個有用的調用shmat()與第二個參數不同於NULL。 – 2010-01-31 00:01:43
將它留空,並讓系統決定正在存儲的內存段的位置,並將其地址返回給您。 – mloskot 2010-01-31 00:18:57