美好的一天。我在兩個不同的進程之間使用共享內存(sysv_ipc),我想在另一個代碼中看到共享內存的最後更新時間。有三個程序,一個寫入共享內存,另一個讀取共享內存,第三個需要外部錯誤處理,所以我想知道共享內存是否在最近幾分鐘內沒有更新。有了這個想法,我嘗試訪問共享內存的屬性「last_attach_time」。當我在終端中運行它時它工作正常。那是我在終端創建了一次共享內存的對象,然後我試着連續訪問這個屬性,它工作得很好。在共享內存寫入數據之前,「last_attach_time」更新了時間,當寫入停止時,輸出變爲常量,這非常好。但是當我包含在具有用於持續監視的while循環的外部錯誤處理代碼中時,該屬性不能提供正確的數據。即,即使在寫入共享存儲器停止後,時間仍然在增加。有沒有人遇到類似的問題。 謝謝。共享內存sysv_ipc Python
0
A
回答
0
我是Python sysv_ipc
模塊的作者。
沒有看到您的代碼,我無法確定發生了什麼事。但我有一種預感。
在您的顯示器代碼中,將內存段的last_pid
值與os.getpid()
的值進行比較。如果它是相同的,那麼你的答案 - last_attach_time
正確地報告你的監視器程序附加到內存的時間,看看是否有任何人連接到它。 :-)
Fuller解釋:使用SysV IPC內存段是一個兩步過程。首先創建它,然後附加它。對於沒有連接的內存段,您無法做很多事情,因此我編寫sysv_ipc
模塊到會自動將該段附加到Python構造函數中。換句話說,Python構造函數爲您執行兩個步驟(創建和附加)。這就是當構造函數的文檔說「內存自動附加」時的含義(但這很容易忽略)。
因此,如果您的顯示器代碼在每次運行時都會創建一個新的sysv_ipc.Semaphore()
對象,則會在此時設置last_attach_time
。
這聽起來像你對上次寫入時間更感興趣,而這不是SysV IPC提供的值。一種方法是將時間戳寫入您寫入共享內存的數據的一部分。
相關問題
- 1. Python共享讀取內存
- 2. 內存共享
- 3. 多進程python與共享內存
- 4. Python多處理 - 共享內存
- 5. CUDA共享內存
- 6. C共享內存
- 7. 在共享內存
- 8. RDMA內存共享
- 9. 共享內存段
- 10. Linux共享內存
- 11. 通過共享內存共享指針
- 12. activerecord內存共享緩存
- 13. IPC與共享內存的共享內存有什麼區別?
- 14. 共享內存段vs共享內存段
- 15. C++共享內存泄漏,如何清除共享內存?
- 16. 共享內存和多
- 17. postgresql:共享內存不足?
- 18. 將共享庫共享到共享內存
- 19. 檢查共享內存是否存在,以及是否存在共享內存
- 20. 增加共享內存的內存
- 21. 共享內存STL地圖
- 22. 瞭解postgreSQL共享內存
- 23. PHP和共享內存
- 24. Java和C++共享內存
- 25. POSIX共享內存和msync
- 26. 共享內存與碼頭
- 27. CUDA:共享內存分配
- 28. 共享內存和IPC
- 29. cuda中的共享內存
- 30. OpenCL-共享內存訪問
在接收器側: ------------------ 而(條件) { \t存儲器= sysv_ipc.SharedMemory(123456) \t mem_data = memory.read () \t打印 「mem_data」 \t CURRENT_TIME =了time.time() \t TIME_DELTA = ABS(CURRENT_TIME - memory.last_attach_time) \t ... } – Venkat
在發送側: --------------------- 而(onSomeCondition) { \t INT的shmid; \t key_t key = 123456; \t char * shared_memory; \t如果((的shmid = shmget的(鍵,30,IPC_CREAT | 0666))<0) \t \t { \t \t \t的printf( 「錯誤獲取共享存儲器ID」); \t \t \t exit(1); \t \t} \t如果((shared_memory =(字符*)的shmat(的shmid,NULL,0))==(字符*)-1) \t { \t \t的printf( 「錯誤附接共享存儲器ID」) ; \t \t exit(1); \t} \t memcpy(shared_memory,combo_xval_yval,sizeof(combo_xval_yval)); } shmdt(shared_memory) – Venkat
謝謝你的回覆。是的,我試圖檢查內存是否在最近幾秒內沒有更新。基於此,我喜歡爲我的程序制定一些行動目標。你提到了我尋找的方法非常恰當的詞:「上次寫入時間」。我沒有使用Semaphore對象,而只使用共享內存對象。我必須檢查不同的PID值,但根據我的理解,我正在爲while循環外部的共享內存創建對象。所以內存塊的PID不會改變,直到內存被清除。我需要確認這一點,我會檢查這一點。 – Venkat