文章目錄
- 1.命名管道
- 2.共享內存
- 3.共享內存的介面
- 4.共享內存的標識符和共享內存的操作句柄的區別是什麼?
- 5.刪除共享內存
1.命名管道
- 命名管道也是內核中開闢的一段緩存區,這段緩存區是有標識符的:意味著:不同的進程,不需要有親緣關係,只需要通過標識符就能找到該緩存區
- 命名管道的創建
- mkfifo [命名管道文件]
p:代表的文件類型為管道文件 - 函數創建
mkfifo函數 - 特性
- 命名管道的生命周期也是跟隨者進程的
- 命名管道是具有標識符的
- 其他的特性和匿名管道是一致的
2.共享內存
- 原理
- 在物理內存當中開闢了一段空間
- 這段物理內存的空間,可以被不同的進程附加到自己的共享區當中
- 附加的進程,通過操作共享區,來交換數據

3.共享內存的介面
- 創建共享內存
- int shmget(key_t key, size_t size, int shmflg)
key:共享內存標識符,這個標識符相當於共享內存的身份證,程序員第一次創建的時候,可以隨意給值,只要和當前操作系統當中的其他的共享內存標識符不重複
size:共享內存的大小,單位:位元組
shmflg:① IPC_CREAT:如果共享內存不存在,則創建共享內存
② IPC_EXCL:需要搭配IPC_CREAT使用,這樣的宏在搭配使用的時候,還是採用按位或的方式(核心就是點陣圖)
eg:IPC_CREAT | IPC_EXCL:
如果想要獲取的共享內存,已經存在,則報錯。如果想要獲取的共享內存,是剛剛新創建出來的共享內存,則返回操作句柄 - 總結:使用shmget這個函數的時候一定要自己剛剛創建出來的共享內存
- 返回值:返回的是共享內存的操作句柄
- 共享內存命令
- ipcs:查看共享內存
- ipcrm -m [shmid]:刪除共享內存
- 共享內存的聲明周期是跟隨著操作系統內核的
- 將共享內存附加到進程
- void shmat(int shmid, const void shmaddr, int shmflg)
shmid:共享內存的操作句柄
shmaddr:附加到共享內存的什麼虛擬地址,允許傳遞NULL值,讓操作系統幫我們選擇附加到共享內存區當中的那個地址,這個地址通過該函數的返回值返回給我們
shmflg:① SHM_RDONLY:規定當前進程只能對共享內存進行讀操作
② 0:可讀可寫 - 返回值:返回共享內存附加到共享區的地址
- 結論:進程在讀取共享內存的時候,是訪問,並不是拿走!
- 將共享內存和進程分離
- int shmdt(const void *shmaddr)
shmaddr:shmat的返回值 - 操作共享內存
- int shmctl(int shmid, int cmd, struct shmid_ds *buf)
shmid:共享內存操作句柄
cmd:告訴shmctl函數需要做什麼操作
① IPC_STAT:獲取當前共享內存的屬性信息,放在buf中,buf是出參
② IPC_SET:設置共享內存的屬性信息,是用buf來進行設置的,buf是入參
③ IPC_RMID:刪除共享內存,buf可以直接傳遞NULL
buf:共享內存的結構體
4.共享內存的標識符和共享內存的操作句柄的區別是什麼?
- 標識符:是用來標識共享內存的,相當於共享內存的身份證,意味著不同的進程可以通過標識符找到這個共享內存
- 操作句柄:進程可以通過操作句柄來對共享內存進行操作(,附加,分離,刪除)
5.刪除共享內存
- 當使用shmctl或者使用ipcrm,刪除共享內存之後,共享內存就實際被釋放掉了
- 當共享內存被釋放掉之後,共享內存的標識符會被設置為0x00000000,表示其他進程不能通過之前的標識符找到該共享內存,並且共享內存的狀態會被設置為dest(destroy)
- 當共享內存被釋放掉之後,但是還是有進程在附加著共享內存,當前描述共享內存的結構體並沒有被釋放,直到當前共享內存的附加進程數量為0的時候才會釋放掉。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/269818.html
微信掃一掃
支付寶掃一掃