C++共享內(nèi)存刪除的陷阱
文章轉(zhuǎn)自微信公眾號:CPP開發(fā)前沿
當進程結(jié)束使用共享內(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ù)結(jié)構(gòu) 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設(shè)置shmid_ds結(jié)構(gòu)中的數(shù)據(jù)反射與共享內(nèi)存相關(guān)聯(lián)的值。IPC_SET如果進程有相應(yīng)的權(quán)限,將與共享內(nèi)存相關(guān)聯(lián)的值設(shè)置為shmid_ds數(shù)據(jù)結(jié)構(gòu)中所提供的值。IPC_RMID刪除共享內(nèi)存段。- 第三個參數(shù),buf,是一個指向包含共享內(nèi)存模式與權(quán)限的結(jié)構(gòu)的指針,刪除的時候可以默認為0。
如果共享內(nèi)存已經(jīng)與所有訪問它的進程斷開了連接,則調(diào)用IPC_RMID子命令后,系統(tǒng)將立即刪除共享內(nèi)存的標識符,并刪除該共享內(nèi)存區(qū),以及所有相關(guān)的數(shù)據(jù)結(jié)構(gòu);
如果仍有別的進程與該共享內(nèi)存保持連接,則調(diào)用IPC_RMID子命令后,該共享內(nèi)存并不會被立即從系統(tǒng)中刪除,而是被設(shè)置為IPC_PRIVATE狀態(tài),并被標記為”已被刪除”(使用ipcs命令可以看到dest字段);直到已有連接全部斷開,該共享內(nèi)存才會最終從系統(tǒng)中消失。
需要說明的是:一旦通過shmctl對共享內(nèi)存進行了刪除操作,則該共享內(nèi)存將不能再接受任何新的連接,即使它依然存在于系統(tǒng)中!所以,可以確知, 在對共享內(nèi)存刪除之后不可能再有新的連接,則執(zhí)行刪除操作是安全的;否則,在刪除操作之后如仍有新的連接發(fā)生,則這些連接都將可能失?。?/p>
Shmdt和shmctl的區(qū)別:
hmdt 是將共享內(nèi)存從進程空間detach出來,使進程中的shmid無效化,不可以使用。但是保留空間。
而shmctl(sid,IPC_RMID,0)則是刪除共享內(nèi)存,徹底不可用,釋放空間。
到此這篇關(guān)于C++共享內(nèi)存刪除的陷阱的文章就介紹到這了,更多相關(guān)共享內(nèi)存刪除的陷阱內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ Qt實現(xiàn)瀏覽器網(wǎng)頁內(nèi)嵌的音視頻播放器
這篇文章主要為大家詳細介紹了如何利用C++ Qt實現(xiàn)瀏覽器網(wǎng)頁內(nèi)嵌的音視頻播放器,并支持軟硬解碼,支持音頻,支持錄像截圖,支持多路播放等,感興趣的可以了解下2024-01-01
c++ Protobuf解決數(shù)據(jù)傳輸瓶頸面試精講
這篇文章主要介紹了c++ Protobuf解決數(shù)據(jù)傳輸瓶頸利器面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10
Vs2019+Qt+Opencv環(huán)境配置心得(圖文)
這篇文章主要介紹了Vs2019+Qt+Opencv環(huán)境配置心得(圖文),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08
C語言統(tǒng)計輸入字符各個字母出現(xiàn)頻率的解題思路
這篇文章主要介紹了C語言統(tǒng)計輸入字符各個字母出現(xiàn)頻率的解題思路,具有一定的參考價值,感興趣的小伙伴們可以參考一下2015-08-08
解決c++?error:crosses?initialization?of?問題
最近在寫代碼的時候,碰到了?crosses?initialization?of?...?的問題,只因我在?switch?的某個?case?分支下定義了一個變量,于是乎便將這個問題整理一下,需要的朋友可以參考下2023-03-03

