删除共享内存_进程通信专题之 共享内存
什么是共享內存呢?
共享內存是被多個進程共享一部分物理內存,共享內存是進程間共享數據最快的辦法,因為一個進程向共享內存中寫了數據,那么共享的這個區域的所有進程就可以立刻看到這里的數據。
共享內存有什么特點呢?
共享內存被創建以后,一直存在于內核中,直到被刪除或者系統關閉,并且讀取后,內容仍在其共享內存中。
第一部分,共享內存的創建
我們可以使用shmget來創建一個共享內存。函數原型如下:
我們來通過一個例子來了解下這個函數:
編譯并運行,在終端輸入命令ipcs -m,可以看見我們創建的共享內存,返回值為共享內存IPC的ID號。因為我們使用的是IPC_PRIVATE,所以共享內存的key都是0。
上圖中,nattch表示連接數目,dest表示共享內存段已經被刪除了,但是還有程序在連接他。這個key值還可以用ftok函數來創建,如果我們使用IPC_PRIVATE這個參數,我們的key都是0,這樣我可以進行有親緣關系的進程通信,如果我們使用ftok函數來創建,可以進行沒有親緣的進程之間的通信:
第二部分,共享內存的映射
我們在用shmget函數在內核創建一個對象,即開辟一個緩存。 為了方便我們對共享內存進行讀寫操作,我們需要把我們開辟的緩存映射到用戶空間去。我們可以使用shmat函數:
第三部分,共享內存的刪除
因為我們的共享內存有個特點,共享內存被創建以后,一直存在于內核中,直到被刪除或者系統關閉,并且讀取后內容仍在其共享內存中,如果想刪除共享內存,我們可以使用shmctl和shmdt。
shmdt函數將我們映射的地址刪除,刪除的是我們映射在用戶空間的地址。函數原型如下:
如果想刪除內核中的對象,我們可以使用shmctl刪除共享內存對象。函數原型如下:
第四部分,共享內存實例
程序目的:實現父子進程間的通信
程序思路:
為了復習一下上一期的內容,我們在實例中加上信號通信,信號通信有疑惑的地方大家可以看上一期文章呢,因為不確定父子進程是誰先運行的,所以我們在父進程中延遲一會,保證子進程先運行,這樣我們父進程發信號給子進程就不會導致子進程停止,父進程往共享內存里面寫完數據后,發信號給子進程,子進程收到信號后開始讀共享內存里面的數據。子進程讀完數據以后,刪除掉進程和內核里面的共享內存。
編譯并運行:
總結:
和信號通信一樣,只要我們明確了共享內存創建,映射,刪除這個流程,共享內存的知識點很容易就掌握了。
總結
以上是生活随笔為你收集整理的删除共享内存_进程通信专题之 共享内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos7 python3.7 ss
- 下一篇: 金蝶软件怎么过账_代理记账用什么财务软件