Linux 深入理解程序間通訊之共享記憶體!!

2021-10-10 10:10:04 字數 2482 閱讀 5860

2. 附加到共享記憶體

3. 共享記憶體和程序分離:

4. 控制共享記憶體

總結實際上是在物理記憶體中開闢了一段空間,該物理記憶體空間可以被不同的程序附加到自己的共享區中,附加的程序通過操作共享區來交換資料

其原理圖:

引數解釋:

key,共享記憶體識別符號,在第一次建立時,可隨意給值,但要和os中其他共享記憶體識別符號不重複。

size,共享記憶體的大小,單位為位元組

shm***:許可權位,取值如下

ipc_creat:如果共享記憶體不存在,則建立共享記憶體

ipc_excl:搭配ipc_creat一起使用。如果共享記憶體已經存在了,則報錯。如果共享記憶體是剛剛建立的,則返回操作控制代碼。

返回值:成功返回操作控制代碼,失敗返回-1,並設定錯誤。

例:

引數解釋:

shmid,操作控制代碼

shm***,操作共享區的許可權

shm_rdonly:當前程序只能對共享記憶體讀操作

0:可讀可寫

返回值:返回共享記憶體附加到共享區的位址,失敗返回-1

例:

另乙個程序進行讀操作:

附加到共享記憶體中的資料可反覆讀取:

ipcs -m檢視,此時有兩個程序附加在當前共享記憶體中。

引數解釋:

shmaddr為shmat所返回的指標

返回值:成功返回0, 失敗返回-1

此時的附加程序數為1。程序脫離共享記憶體,不等於刪除了共享記憶體段。

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

引數解釋:

shmid,操作控制代碼

cmd,三個取值

ipc_stat:獲取當前共享記憶體的屬性資訊,放在buf中,buf為出參

ipc_set:設定共享記憶體的屬性資訊,用buf來設定,buf為入參

ipc_rmid:刪除共享記憶體段,buf可以傳遞為null

3.buf:共享記憶體的結構體

例:檢視當前共享記憶體段的大小

重新設定當前共享記憶體段的大小:

刪除共享記憶體段:

shmctl

(shmid,ipc_rmid,

null

);

但是在刪除共享記憶體的時候,若是還有附加的程序,則不會進行刪除,直到沒有附加的程序,才會進行刪除。

共享記憶體的生命週期是跟隨os的。

程序在讀取共享記憶體的時候,是讀取,不是拿走。

刪除共享記憶體:

一、當使用shmctl或ipcrm之後,共享記憶體實際上已經被釋放了

二、當共享記憶體被釋放之後,共享記憶體識別符號會被設定為0x00000000,其它程序不能通過之前的識別符號找到該共享記憶體,並且關閉記憶體狀態,會被設定為destroy

三、共享記憶體被釋放,但還有記憶體附加,當前描述記憶體的結構體沒有被釋放,直到程序附加數為0時,共享記憶體資源會被釋放。

深入理解Linux核心 程序

1 程序的靜態特性 程序 程式執行時的乙個例項 程序描述符 task struct 程序的基本資訊 thread info 指向記憶體區描述符的指標 mm struct 程序相關的tty tty struct 當前目錄 fs struct 指向 檔案描述符的指標 files struct 所接收的訊...

深入理解執行緒間的通訊方式

等待 通知機制就是,執行緒a呼叫了物件o的wait 方法進入等待狀態,執行緒b 呼叫了物件o的notify 或者notifyall 喚醒處於物件o上等待的執行緒a,使執行緒a 從wait 方法處返回從而進行剩餘操作。上述兩個執行緒通過物件o來進行互動,而物件o上的wait notify notify...

深入理解 linux swapper 程序

對於父程序已經終止的所有程序,他們的父程序都改變為init。在乙個程序終止時,核心逐個檢查所有活動的程序,以判斷他是否是正要終止程序的子程序,如果是,則將該程序id更改為1,這種方法保證了每個程序都有乙個父程序。如果子程序在父程序終止之前終止,父程序如何能做相應檢驗得到子程序的終止狀態呢?對此的回答...