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