Linux開發實踐 使用共享記憶體遇到的問題

2021-10-16 18:25:36 字數 943 閱讀 7705

**於網路

參考資料

想通過乙個can服務程式,專門用於兩路can的資料收發,將收發的資料分別放入兩個共享記憶體塊,這個can服務程式是後台程序,如此,其他程序就可以隨意地對共享記憶體中的資料進行讀取了。想是這麼想的。但是在實際的開發過程中,出現了這樣的問題:

當can服務程式收到10幀資料,我開啟的兩個應用程式,分別收到5幀,為什麼會出現這樣的情況?為什麼不是都收到10幀資料呢?

當can服務程序接收到資料後,sem_post(),此時正在sem_wait()的其他程序其實是在競爭的,誰競爭到這個訊號量,誰就被喚醒,所以,就會出現10幀資料,被兩個程序「平分」的現象。

若一共有三個程序,要用到can服務程序放入共享記憶體的資料,則建立三個訊號訊號量,當收到資料後sem_post()三次,如此則三個程序都能被喚醒。

實測,問題解決,實際測試如下:

還可以將同乙個訊號量,sem_post()三次,也可以解決問題。

shmget 共享記憶體 同步讀寫檔案乙個程序寫,多個程序讀,讀和寫同步,邊寫邊讀

【operating system】程序 - 程序 / 執行緒間通訊

zlg產品使用者手冊-m6g2c/a6g2c 工控核心板

linux程序間通訊(五):訊號量 semget()、semop()、semctl()

semctl函式

Linux 使用共享記憶體

1.共享記憶體與訊息佇列的區別 訊息佇列在實現訊息的收發時,首先由傳送程序從程序空間將資料複製到核心分配的資料緩衝區中,接受程序再從核心的緩衝區複製到程序的虛擬位址空間 共享記憶體是將核心分配的共享儲存區域對映到程序的位址空間實現的,沒有資料的複製過程,共享記憶體的訪問速度要比訊息佇列快 2.共享記...

linux共享記憶體使用例項

三個檔案,乙個標頭檔案,乙個讀,乙個寫,用同乙個key值申請共享記憶體。shm.h ifndef shm com h define shm com h 1 define text sz 2048 struct shared use at struct kts endif shm write.c in...

linux共享記憶體的使用

linux共享記憶體和windows的共享記憶體邏輯上有很大區別,要注意一下幾點 標識描述 ipc excl 這個加入後,如果已經存在標識為key的共享記憶體則報錯返回 1 0如果是0 的話,就可以實現,如果共享記憶體不存在則返回失敗 1,否則直接建立返回成功 0666 這個識別符號很多人不知道啥意...