日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

删除共享内存_进程通信专题之 共享内存

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 删除共享内存_进程通信专题之 共享内存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是共享內存呢?

共享內存是被多個進程共享一部分物理內存,共享內存是進程間共享數據最快的辦法,因為一個進程向共享內存中寫了數據,那么共享的這個區域的所有進程就可以立刻看到這里的數據。

共享內存有什么特點呢?

共享內存被創建以后,一直存在于內核中,直到被刪除或者系統關閉,并且讀取后,內容仍在其共享內存中。

第一部分,共享內存的創建

我們可以使用shmget來創建一個共享內存。函數原型如下:

我們來通過一個例子來了解下這個函數:

編譯并運行,在終端輸入命令ipcs -m,可以看見我們創建的共享內存,返回值為共享內存IPC的ID號。因為我們使用的是IPC_PRIVATE,所以共享內存的key都是0。

上圖中,nattch表示連接數目,dest表示共享內存段已經被刪除了,但是還有程序在連接他。這個key值還可以用ftok函數來創建,如果我們使用IPC_PRIVATE這個參數,我們的key都是0,這樣我可以進行有親緣關系的進程通信,如果我們使用ftok函數來創建,可以進行沒有親緣的進程之間的通信:

第二部分,共享內存的映射

我們在用shmget函數在內核創建一個對象,即開辟一個緩存。 為了方便我們對共享內存進行讀寫操作,我們需要把我們開辟的緩存映射到用戶空間去。我們可以使用shmat函數:

第三部分,共享內存的刪除

因為我們的共享內存有個特點,共享內存被創建以后,一直存在于內核中,直到被刪除或者系統關閉,并且讀取后內容仍在其共享內存中,如果想刪除共享內存,我們可以使用shmctl和shmdt。

shmdt函數將我們映射的地址刪除,刪除的是我們映射在用戶空間的地址。函數原型如下:

如果想刪除內核中的對象,我們可以使用shmctl刪除共享內存對象。函數原型如下:

第四部分,共享內存實例

程序目的:實現父子進程間的通信

程序思路:

為了復習一下上一期的內容,我們在實例中加上信號通信,信號通信有疑惑的地方大家可以看上一期文章呢,因為不確定父子進程是誰先運行的,所以我們在父進程中延遲一會,保證子進程先運行,這樣我們父進程發信號給子進程就不會導致子進程停止,父進程往共享內存里面寫完數據后,發信號給子進程,子進程收到信號后開始讀共享內存里面的數據。子進程讀完數據以后,刪除掉進程和內核里面的共享內存。

編譯并運行:

總結:

和信號通信一樣,只要我們明確了共享內存創建,映射,刪除這個流程,共享內存的知識點很容易就掌握了。

總結

以上是生活随笔為你收集整理的删除共享内存_进程通信专题之 共享内存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。