Posix消息隊列和SystemV消息隊列_第1頁
Posix消息隊列和SystemV消息隊列_第2頁
Posix消息隊列和SystemV消息隊列_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Posix 消息隊列和 SystemV 消息隊列今天弄了一天 SystemV 消息隊列,遇到了問題終于解決了。在此總結(jié)一下。msgsnd(intmsqid,constvoid*ptr,size_tlength,intflag)中 10ng 類型的消息類型不能為 0,否則發(fā)送會失敗。msgrcv(intmsqid,void*ptr,size_tlength,longtype,intflag)中 ptr 必須是一個結(jié)構(gòu)體的地址,并且該結(jié)構(gòu)體第一個成員要是 long 類型。否則會接收失敗。消息隊列消息隊列可以認為是一個消息鏈表。有足夠?qū)憴?quán)限的線程就可往隊列中放置消息,有足夠讀權(quán)限的線程就可以從隊列中

2、取走消息。每個消息是一個記錄,他有發(fā)送者賦予一個優(yōu)先級。在某個進程往一個隊列寫入消息之前,并不需要另外某個進程在該隊列上等待消息的到達。Posix 消息隊列和 SystemV 系統(tǒng)的消息隊列區(qū)別:1、對 Posix 消息隊列的讀總是返回最高優(yōu)先級的最早消息,對 SystemV 消息隊列得讀則可以返回任意指定優(yōu)先級的消息2、當(dāng)往一個隊列放置一個消息時,Posix 消息隊列允許產(chǎn)生一個信號或啟動一個線程,SystemV 消息隊列則不提供類似的機制消息的屬性:1、一個無符號整數(shù)優(yōu)先級(Posix)或是長整類型(SystemV)2、消息的數(shù)據(jù)部分長度3、數(shù)據(jù)本身(SystemV 系統(tǒng)發(fā)送消息時需要定義

3、消息的結(jié)構(gòu),而 Posix 系統(tǒng)不需要定義這樣的結(jié)構(gòu))Posxi 消息隊列mq_open 創(chuàng)建一個新消息隊列或是打開一個已經(jīng)存在的消息隊列,返回值成為消息隊列描述字。mq_close 關(guān)閉已打開的消息隊列。mq_unlink 從系統(tǒng)刪除消息隊列。每個消息隊列有四個屬性,有 mq_getattr 獲得這些屬性,mq_setattr 設(shè)置其中某個屬性mq_send 用于往一個隊列中放置一個消息mq_receive:用于往一個隊列中取走一個消息,該函數(shù)總是返回所指定隊列中最高優(yōu)先級的最早的消息,而且該優(yōu)先級能隨該消息的內(nèi)容及長度一同返回。每個消息有一個優(yōu)先級,他是一個小于 MQ_PRIO_MAX 的

4、無符號整數(shù),Posix要求這個上限至少為 320mq_notify 該函數(shù)給指定隊列建立或刪除異步事件通知intmq_notify(mqd_tmqdes,conststructsigeventnotification);使用規(guī)則:1、 如果 notification 參數(shù)非空, 那么當(dāng)前進程希望在有一個消息到達所指定隊列而且該隊列先前為空時得到通知。我們說該進程被注冊為接收該隊列的通知 2、如果notification 參數(shù)為空指針,而且當(dāng)前進程目前被注冊為接收所指定隊列的通知,那么現(xiàn)有注冊將被撤銷。3、任意時刻只有一個進程可以被注冊為接收某個給定隊列的通知。4、當(dāng)有一個消息到達某個先前為空的

5、隊列,而且已有一個進程被注冊為接收該隊列的通知時,只有沒有任何進程阻賽在該隊列的 mq_receive 調(diào)用的前提下,通知才會發(fā)生。這就是說,在 mq_revcive 調(diào)用中的阻賽比任何通知的注冊都優(yōu)先。5、當(dāng)該通知被發(fā)送給他的注冊進程時,其注冊即被撤銷,該進程必須再次調(diào)用該函數(shù)以重新注冊。(當(dāng)消息隊列有消息來到時該函數(shù)產(chǎn)生一個信號或時線程,信號或線程是由 structsigevent 參數(shù)指定的)SystemV 的消息隊列SystemV 消息隊列使用消息隊列標(biāo)示符標(biāo)示。具有足夠特權(quán)的任何進程都可以往一個隊列放置一個消息,具有足夠特權(quán)的任何進程都可以從一個給定隊列讀出一個消息。對于系統(tǒng)中的每個

6、消息隊列,內(nèi)核維護一個信息結(jié)構(gòu),structmsqid_dsmsgget 函數(shù)用于創(chuàng)建一個新的消息隊列或訪問一個已經(jīng)存在的消息隊列msgget(key_tkey,intoflag),在創(chuàng)健一個新消息隊列時,msqid_ds 結(jié)構(gòu)將被初始化。msgsnd 函數(shù)往 msgget 函數(shù)建立的消息隊列中放置一個消息,msgsnd(intmsqid,constvoid*ptr,size_tlength,intflag);其中 ptr 是個結(jié)構(gòu)指針,該結(jié)構(gòu)具有如下的模板 structmsgbuflongmtype;charmtext1;該模板可以在;中找至 ij其中消息類型必須大于 0,msgbuf 結(jié)構(gòu)

7、定義中的名字 mtext 不大確切;消息的數(shù)據(jù)部分并不局限于文本,任何形式的數(shù)據(jù)都是允許的,無論是二進制數(shù)據(jù)還是文本。內(nèi)核根本不解釋消息數(shù)據(jù)的內(nèi)容。使用模板的說法描述這個結(jié)構(gòu),因為 ptr 所指向的只是一個含有消息類型的長整數(shù),消息本身則緊跟在他之后。不過大多數(shù)應(yīng)用并不使用 msgbuf結(jié)構(gòu)的這個定義,因為其數(shù)據(jù)量通常是不夠的。大多數(shù)應(yīng)用定義自己的消息結(jié)構(gòu),其數(shù)據(jù)部分根據(jù)應(yīng)用的需要定義。例如:應(yīng)用需要交換由一個 16 位整數(shù)后跟一個 8 字節(jié)字符數(shù)組構(gòu)成的消息,那么它的結(jié)構(gòu)如下:typedefstructmy_msgbuflongmytype;int16_tmshort;charmchar8;

8、msgsnd 的 length參數(shù)以字節(jié)為單位指定代發(fā)送消息的長度。這是位于長整數(shù)消息類型之后的用戶自定義數(shù)據(jù)的長度。該長度可以是 00 如上例長度為sizeof(structmy_msgbuf)-sizeof(long).msgrcv(intmsqid,void*ptr,size_tlength,longtype,intflag)函數(shù)中ptr參數(shù)指定所接受消息的存放位置。和 msgsnd 一樣,該指針指向緊挨在真正的消息數(shù)據(jù)之前返回的長整數(shù)類型字段(就是定義的消息結(jié)構(gòu)體)。Length 指定由 ptr 指向的緩沖區(qū)中數(shù)據(jù)部分的大小。這是該函數(shù)能返回的最大數(shù)據(jù)量。該長度不包括長整數(shù)類型字段。Type 指定希望從所給定的隊列中讀出什么樣的消息:如果 type 為 0,那就返回該隊列中的第一個消息。如果 type 大于 0,那就返回其類型值為 type 的第一個消息。如果 type 小于 0,那就返回其類型值小于或等于 type 參數(shù)的絕對值的消息中類型值得最小的第一個消息。Msgrcv的flag參數(shù)指定所請求類型的消息不在所指定的隊列中時怎么辦。 成功返回時,msgrcv 返回所接收消息中數(shù)據(jù)的字節(jié)數(shù)。他不包括也通過 ptr 參數(shù)返回的長整數(shù)消息類型所需的幾個字節(jié)。Msgctl 函數(shù)提供在一個消息隊列上的各種控制操作。Msgctl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論