溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++共享內(nèi)存刪除的陷阱是怎樣的

發(fā)布時間:2022-01-06 12:52:49 來源:億速云 閱讀:170 作者:柒染 欄目:開發(fā)技術

C++共享內(nèi)存刪除的陷阱是怎樣的,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

當進程結束使用共享內(nèi)存區(qū)時,要通過函數(shù) shmdt 斷開與共享內(nèi)存區(qū)的連接。該函數(shù)聲明在 sys/shm.h 中,其原型如下:
 

int shmdt(const void *shmaddr);

參數(shù) shmaddr 是 shmat 函數(shù)的返回值。

進程脫離共享內(nèi)存區(qū)后,數(shù)據(jù)結構 shmid_ds 中的 shm_nattch 就會減 1 。但是共享段內(nèi)存依然存在,只有 shm_attch 為 0 后,即沒有任何進程再使用該共享內(nèi)存區(qū),共享內(nèi)存區(qū)才在內(nèi)核中被刪除。一般來說,當一個進程終止時,它所附加的共享內(nèi)存區(qū)都會自動脫離。
我們通過:
 

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

來刪除已經(jīng)存在的共享內(nèi)存:

  • 第一個參數(shù),shmid,是由shmget所返回的標記符。

  • 第二個參數(shù),cmd,是要執(zhí)行的動作。他可以有三個值:

命令 描述:

  • IPC_STAT 設置shmid_ds結構中的數(shù)據(jù)反射與共享內(nèi)存相關聯(lián)的值。

  • IPC_SET 如果進程有相應的權限,將與共享內(nèi)存相關聯(lián)的值設置為shmid_ds數(shù)據(jù)結構中所提供的值。

  • IPC_RMID 刪除共享內(nèi)存段。

  • 第三個參數(shù),buf,是一個指向包含共享內(nèi)存模式與權限的結構的指針,刪除的時候可以默認為0。

如果共享內(nèi)存已經(jīng)與所有訪問它的進程斷開了連接,則調(diào)用IPC_RMID子命令后,系統(tǒng)將立即刪除共享內(nèi)存的標識符,并刪除該共享內(nèi)存區(qū),以及所有相關的數(shù)據(jù)結構;

如果仍有別的進程與該共享內(nèi)存保持連接,則調(diào)用IPC_RMID子命令后,該共享內(nèi)存并不會被立即從系統(tǒng)中刪除,而是被設置為IPC_PRIVATE狀態(tài),并被標記為”已被刪除”(使用ipcs命令可以看到dest字段);直到已有連接全部斷開,該共享內(nèi)存才會最終從系統(tǒng)中消失。

需要說明的是:一旦通過shmctl對共享內(nèi)存進行了刪除操作,則該共享內(nèi)存將不能再接受任何新的連接,即使它依然存在于系統(tǒng)中!所以,可以確知, 在對共享內(nèi)存刪除之后不可能再有新的連接,則執(zhí)行刪除操作是安全的;否則,在刪除操作之后如仍有新的連接發(fā)生,則這些連接都將可能失敗!

Shmdt和shmctl的區(qū)別:

hmdt 是將共享內(nèi)存從進程空間detach出來,使進程中的shmid無效化,不可以使用。但是保留空間。
shmctl(sid,IPC_RMID,0)則是刪除共享內(nèi)存,徹底不可用,釋放空間。

關于C++共享內(nèi)存刪除的陷阱是怎樣的問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業(yè)資訊頻道了解更多相關知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

c++
AI