成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解Unix消息隊列知識

系統 其他OS
我們對Unix消息隊列知識進行詳解。網絡應用的標準模型是客戶一服務員模型。在金融系統應用軟件開發中,這種模型被廣泛的采用,并且實現這種模型的方法多種多樣。

學習了很久的Unix操作系統的知識,今天,我們來給大家介紹下Unix消息隊列相關方面的知識。希望大家可以好好的學習。

在Unix操作系統的內部結構中,含有消息機構,即所有的消息都放在內核中,并且它們都有一個相應的Unix消息隊列號。消息機構允許進程發送一個消息到任意其它進程,從而實現系統中進程間的通信。

一、Unix操作系統中的消息機構

消息是一個格式化的可變長度的信息單元。它有如下屬性:(1)長整數類型 (2)消息的數據長度 (3)數據。由于消息的長度是可變的,故將消息分為消息首部和消息數據兩部分。在消息首部中,記錄著消息的類型和大小,指向消息數據區的指針,Unix消息隊列的鏈接指針等。

每個消息隊列有一個稱為 key的名稱,如同用戶文件描述符一樣,每個Unix消息隊列還有一個消息隊列描述符。此外,在一個系統中,可能有若干個Unix消息隊列,所有Unix消息隊列的頭標組成一個數組。 

1. Unix操作系統建立或返回Unix消息隊列描述符

進程可用系統調用megget來建立或返回Unix消息隊列的描述符。該系統調用的語法格式為:
 

  1. int megget(key,msgflg)   
  2. key_t key;   
  3. int megflg;  

其中,key是Unix消息隊列的名字;msgflg是用戶設置的標志。如果IPC_CREAT表示系統無以key命名的消息隊列,則建立消息隊列標識符;若已存在,則返回Unix消息隊列描述符msgid。

對于系統調用,核心將搜索Unix消息隊列頭標數組,確定是否有指定關鍵字的Unix消息隊列。若無,核心將分配一新的隊列結構,并返回給用戶一個Unix消息隊列描述符;否則,它只是檢查Unix消息隊列的許可權之后便返回。

2.Unix操作系統消息的發送

進程可用megsnd( )系統調用來發送一個消息,并將它鏈入Unix消息隊列的尾部。該系統調用的語法格式如下:
 

  1. int msgsnd(msgid,msgp,msgsz,msgflg)   
  2. int msgid;   
  3. struct msgbuf * msgp;   
  4. int msgsz,msgflg;  

其中,msgid是由msgget返回的Unix消息隊列描述符;msgp指向包含這條消息的結構,該結構由如下兩個成員組成:
 

  1. struct msgbuf   
  2. { long mtype; /* 消息類型 */    
  3. char mtext[ ]; /* 消息的文本 */ }  

msgsz是mtext的字節長度;msgflg規定了當無內存空間來存儲消息時,進程等待還是立即返回。

對于msgsnd( )系統調用,核心檢查消息隊列描述符和許可權是否合法;消息長度是否超過系統規定的長度,若過長,進程睡眠等待出現足夠大的空間,通過檢查后,核心為消息分配消息數據區,并將消息從用戶空間拷貝到消息數據區,分配消息首部,將它鏈入該Unix消息隊列的尾部,在消息首部填寫消息類型,大小以及指向消息數據區的指針,還有修改消息隊列的頭標中的數據。然后喚醒在等待消息到來的隊列中睡眠的進程。

3. Unix操作系統消息的接收

進程可用msgrcv( )系統調用,從Unix消息隊列中讀一條消息,語法格式為:
 

  1. int msgrcv(msgid,msgp,msgsz,msgtyp,msgflg)   
  2. int msgid,msgsz,msgflg;   
  3. struct msgbuf * msgp;   
  4. long msgtyp; 

其中,msgid,msgp,msgsz,msgflg與msgsnd相似,msgtype是規定用戶想讀的消息類型。

對于msgrcv( )系統調用是先由核心檢查消息隊列標識符和許可權,接著根據msgtyp分三種情況處理。

(1) msgtyp=0,核心尋找Unix消息隊列中的第一個消息,并將它返回給調用進程;
(2)msgtyp為正整數,核心返回給類型的第一個消息;
(3)msgtyp為負整數,核心應在其類型值小于或等于msgtyp絕對值的所有消息中,選擇類型最低的第一消息返回。

如果所返回的消息的大小等于或小于用戶請求,核心便將消息正文拷貝到用戶區,再從隊列中刪除該消息,并喚醒睡眠的發送進程;如果消息比用戶要求的大,則系統返回錯誤信息。

4. Unix操作系統Unix消息隊列的操縱

可利用msgctl( )系統調用,來改變Unix消息隊列的屬性,即擁有者,許可權等。其語法格式如下:
 

  1. int msgctl(msgid,cmd,buf)   
  2. int msgid,cmd;   
  3. struct msgid_ds * buf;  

其中,cmd是規定的命令;buf是用戶緩沖區地址,用戶用它來存放控制參數和查詢結果。命令可分為三類:(1)用于查詢有關Unix消息隊列的情況。(2)用于改變有關Unix消息隊列的屬性。(3)消除Unix消息隊列的標識符。

二、Unix操作系統多路復用消息

在客戶-服務員模型中,一個服務員往往對應多個客戶。這時我們可以利用消息的類型參量,讓多個進程把消息放入同一個隊列中,以便Unix消息隊列能夠多路復用。如圖2 所示,我們只要把type置為1,以表示消息是從客戶流向服務員的。

如果客戶把它的進程號作為消息的一部分傳遞,那么服務員只要把客戶進程號作為其消息類型,把它的消息發送給客戶進程。每個客戶進程都把msgrcv的參數msgtyp置為其進程號。

這樣,我們就介紹玩了Unix操作系統的Unix消息隊列的知識。

【編輯推薦】

  1. HP Tru64 UNIX消息隊列處理本地拒絕服務漏洞
  2. Linux多線程同步之消息隊列
  3. WCF消息隊列系列介紹
  4. C#操作消息隊列的代碼
  5. HP Tru64 UNIX消息隊列處理本地拒絕服務漏洞
責任編輯:小霞
相關推薦

2010-04-21 12:39:48

Unix 消息隊列

2010-04-21 12:12:56

Unix 消息隊列

2010-04-21 14:39:59

Unix消息隊列

2010-04-21 14:49:13

Unix消息隊列

2017-10-11 15:08:28

消息隊列常見

2010-04-29 16:15:26

Unix文件

2010-04-30 13:27:26

Unix cronta

2010-05-04 12:25:28

Unix鏈接

2010-05-05 13:45:21

Unix Telnet

2010-05-04 09:22:10

Unix文件

2010-04-30 13:38:51

Unix at命令

2010-05-05 17:32:29

Unix Superd

2010-05-05 13:13:55

Unix內核

2010-04-21 14:29:52

Unix 線程

2010-04-30 18:20:23

Unix系統

2010-05-04 09:45:28

Unix系統

2010-04-13 17:52:16

Unix交換區

2010-05-05 13:22:29

Unix Shell

2010-04-21 13:41:41

Unix內核

2010-04-21 18:17:01

Unix配置協議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜理伦三级理论三级在线观看 | 玖玖在线精品 | 久草网站 | 欧美亚洲国产日韩 | 日韩中文字幕视频 | 久久天堂 | 91九色porny首页最多播放 | 亚洲一二三在线观看 | 日韩欧美在线不卡 | 亚洲日本欧美日韩高观看 | 亚洲欧美日韩电影 | 日日噜噜夜夜爽爽狠狠 | 亚洲高清视频一区 | 成人性视频免费网站 | 国产午夜精品一区二区三区在线观看 | 男女免费观看在线爽爽爽视频 | 91亚洲国产精品 | 日韩一区二区在线视频 | 日韩一区二区av | 在线国产小视频 | 久久久久久久久久影视 | 91在线视频播放 | 日韩精品在线观看网站 | 欧美三区在线观看 | 国产美女黄色片 | 国产精品国产精品国产专区不卡 | 精品国产乱码一区二区三区 | 免费观看av| 国产精品视频网 | 91免费观看国产 | 亚洲国产成人av好男人在线观看 | 免费在线看黄 | www.中文字幕.com | 亚洲国产欧美一区 | 国产精品一区二区三区四区 | 免费天天干 | 成人影院av | 欧美日韩视频在线第一区 | 精精国产xxxx视频在线 | 在线色网 | 欧美在线 |