消息隊列和信號量
- 一.消息隊列
- 1.原理
- 2.消息隊列的各種接口
- 1.創建消息隊列
- 2.釋放消息隊列
- 3.發送和接收信息
- 二.信號
- 1.概念
- 2.各種接口
- 1.創建信號量
- 2.銷毀信號量
- 3.對信號量進行操作
- 三.一個現象
一.消息隊列
1.原理
這種消息隊列被稱為system V標準。
可以使用ipcs -q來查詢消息隊列,用ipcrm -q+msqid來刪除消息隊列。
2.消息隊列的各種接口
1.創建消息隊列
第一個參數
第二個參數
2.釋放消息隊列
第一個參數:就是msgget的返回值(隊列的唯一標識符)
第二個參數:要進行什么操作。(有許多參數可以自行查看,這里使用 IPC_RMID刪除該隊列)
第三個參數:各種隊列的的屬性。
3.發送和接收信息
發送消息
第一個參數:隊列的唯一標識符。
第二個參數:數據塊的起始地址。
第三個參數:數據塊的大小。
第四個參數
接收消息
前三個和第五個參數與讀一致。
第四個參數:讀取數據的類型。
‘
二.信號
1.概念
解釋一個現象:多進程,多并發打印時會屏幕出現錯亂,命令行重疊…就是因為屏幕也是文件,沒有進行互斥保護。
理解信號量(信號燈)
信號量(燈)的本質就是一個計數器。描述臨界資源的資源數。
如果一個臨界資源只能由一個執行流訪問,像這種只有0,1兩態的計數器稱為二元信號量–本質就是一個鎖!
PV操作
申請信號量,簡單來說就是對計數器減減——P操作。 釋放信號量,簡單來說就是對計數器加加——V操作。
申請和釋放的PV操作——原子的(要么不做,要么就做完,沒有正在做的概念)。
2.各種接口
1.創建信號量
第一個參數:key值可以參考共享內存和消息隊列的key值,就不再過多描述。
第二個參數:要創建信號的數量。
第三個參數:也參考共享內存和消息隊列的flg。
返回信號量的唯一標識符。
2.銷毀信號量
第一個參數:信號量標識符。
第二個參數:信號量個數。
第三個參數:可以傳各種控制操作(傳IPC_RMID表示刪除)。
3.對信號量進行操作
第一個參數:信號量唯一標識符。
第二個參數:需要自定義一個sembuf類型的結構體,里面要包含操作哪一個信號量,信號量的操作(1代表實現V操作,-1代表實現P操作)
三.一個現象
不論是之前的共享內存,還是消息隊列,還是信號量…這些systemV類型通信方式,它都會先進行組織,也就是建立對應屬性的結構體。
共享內存
消息隊列
信號量
這些結構體的第一個參數都是struct ipc_perm類型。操作系統統一將這一類的結構體的地址存放在struct ipc_permarr[]數組里。所以如果我們需要對資源進行增刪查改就轉化成了對該數組進行增刪查改。