Linux学习笔记-消息队列概念
目錄
System V IPC概念
System V IPC對象的訪問
舉幾個例子
IPC對象的權(quán)限和所有者結(jié)構(gòu)體
消息隊(duì)列
消息隊(duì)列屬性
?
System V IPC概念
Unix系統(tǒng)存在信號、管道和命令管道等基本進(jìn)程間通訊機(jī)制。
System V引入了三種高級進(jìn)程間通信機(jī)制:消息隊(duì)列、共享內(nèi)存、信號量;
IPC對象(消息隊(duì)列、共享內(nèi)存、信號量)存在于內(nèi)核中而不是文件系統(tǒng)中,由用戶控制釋放(用戶管理ipc對象的生命周期),不像管道的釋放由內(nèi)核控制。
IPC對象通過其標(biāo)識符來引用和訪問,所有IPC對象在內(nèi)核空間中有唯一性標(biāo)識ID,在用戶控件中的唯一性標(biāo)識稱為key。
?
System V IPC對象的訪問
IPC對象是全局對象:可用ipcs,ipcrm等命令查看或刪除。
每個IPC對象都由get函數(shù)創(chuàng)建:
msgget,shmget,semget
調(diào)用get函數(shù)時必須指定關(guān)鍵字key
?
舉幾個例子
注意:管道是由內(nèi)核控制,IPC是用戶自己控制,所以要手動釋放;
舉個例子:ipcs和ipcrm命令:
由上可知:
通信有3種,如下:
1. Shared Memory Segments;
2. Semaphore Arrays;
3. Message Queues;
?
如果加-m是指memory,-q是Queues如下:
?
IPC對象的權(quán)限和所有者結(jié)構(gòu)體
struct ipc_perm{uid_t uid; //所有者的使用idgid_t gid; //所有者的組uid_t cuid; //創(chuàng)建者的idgid_t cgid; //創(chuàng)建者的組mode_t mode; //訪問模塊... };?
消息隊(duì)列
1. 消息隊(duì)列是內(nèi)核中的一個鏈表;
2. 用戶進(jìn)程將數(shù)據(jù)傳輸?shù)絻?nèi)核后,內(nèi)核重寫添加一些如用戶ID、組ID、讀寫進(jìn)程的ID和優(yōu)先級等相關(guān)信息后并打成一個數(shù)據(jù)包稱為消息;
3.運(yùn)行一個或者多個進(jìn)程往消息隊(duì)列中寫消息和讀取消息,但一個消息只能被一個進(jìn)程讀取,讀取完畢后就自動刪除;
4.消息隊(duì)列具有一定的FIFO的特性,消息可以按照順序發(fā)送到隊(duì)列中,也可以幾種不同的方式從隊(duì)列中讀取。沒一個消息隊(duì)列在內(nèi)核中用一個唯一的IPC消息表示ID表示;
5.消息隊(duì)列到實(shí)現(xiàn)包括創(chuàng)建和打開隊(duì)列、發(fā)送消息、讀取消息、控制消息隊(duì)列四種操作。
?
消息隊(duì)列屬性
struct msqid_ds{struct ipc_perm msg_perm;msgqnum_t msg_qnum; //消息隊(duì)列數(shù)量msglen_t msg_qbytes; //隊(duì)列的最大字節(jié)pid_t msg_lspid; //最后發(fā)送的pidpid_t msg_lrpid; //最后接收的pidtime_t msg_stime; //最后發(fā)送的時間time_t msg_ctime; //最后改變的時間 };?
總結(jié)
以上是生活随笔為你收集整理的Linux学习笔记-消息队列概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端笔记-Vue中缺少router-vi
- 下一篇: Spring中使用XML方式导入Spri