2017-08-24 82 views
0

美好的一天。我在兩個不同的進程之間使用共享內存(sysv_ipc),我想在另一個代碼中看到共享內存的最後更新時間。有三個程序,一個寫入共享內存,另一個讀取共享內存,第三個需要外部錯誤處理,所以我想知道共享內存是否在最近幾分鐘內沒有更新。有了這個想法,我嘗試訪問共享內存的屬性「last_attach_time」。當我在終端中運行它時它工作正常。那是我在終端創建了一次共享內存的對象,然後我試着連續訪問這個屬性,它工作得很好。在共享內存寫入數據之前,「last_attach_time」更新了時間,當寫入停止時,輸出變爲常量,這非常好。但是當我包含在具有用於持續監視的while循環的外部錯誤處理代碼中時,該屬性不能提供正確的數據。即,即使在寫入共享存儲器停止後,時間仍然在增加。有沒有人遇到類似的問題。 謝謝。共享內存sysv_ipc Python

回答

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提供的值。一種方法是將時間戳寫入您寫入共享內存的數據的一部分。

+0

在接收器側: ------------------ 而(條件) { \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

+0

在發送側: --------------------- 而(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

+0

謝謝你的回覆。是的,我試圖檢查內存是否在最近幾秒內沒有更新。基於此,我喜歡爲我的程序制定一些行動目標。你提到了我尋找的方法非常恰當的詞:「上次寫入時間」。我沒有使用Semaphore對象,而只使用共享內存對象。我必須檢查不同的PID值,但根據我的理解,我正在爲while循環外部的共享內存創建對象。所以內存塊的PID不會改變,直到內存被清除。我需要確認這一點,我會檢查這一點。 – Venkat