亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

linux消息隊列操作

系統(tǒng) 2185 0

對消息隊列的操作無非有以下三種類型:

1、 打開或創(chuàng)建消息隊列
消息隊列的內(nèi)核持續(xù)性要求每一個消息隊列都在系統(tǒng)范圍內(nèi)相應(yīng)唯一的鍵值,所以,要獲得一個消息隊列的描寫敘述字,僅僅需提供該消息隊列的鍵值就可以;

注:消息隊列描寫敘述字是由在系統(tǒng)范圍內(nèi)唯一的鍵值生成的,而鍵值能夠看作相應(yīng)系統(tǒng)內(nèi)的一條路經(jīng)。

2、 讀寫操作

消息讀寫操作很easy,對開發(fā)者來說,每一個消息都相似例如以下的 數(shù)據(jù) 結(jié)構(gòu):

                
                  struct msgbuf{

long mtype;

char mtext[1];

};
                
              

mtype成員代表消息類型,從消息隊列中讀取消息的一個重要根據(jù)就是消息的類型;mtext是消息內(nèi)容,當(dāng)然長度不一定為1。因此,對于發(fā)送消息來說,首先預(yù)置一個msgbuf緩沖區(qū)并寫入消息類型和內(nèi)容,調(diào)用對應(yīng)的發(fā)送函數(shù)就可以;對讀取消息來說,首先分配這樣一個msgbuf緩沖區(qū),然后把消息讀入該緩沖區(qū)就可以。

3、 獲得或設(shè)置消息隊列屬性:

消息隊列的信息基本上都保存在消息隊列頭中,因此,能夠分配一個相似于消息隊列頭的結(jié)構(gòu)(struct msqid_ds,見 附錄 2 ),來返回消息隊列的屬性;相同能夠設(shè)置該 數(shù)據(jù) 結(jié)構(gòu)。



消息隊列API

1、文件名稱到鍵值

                
                  #include <sys/types.h>

#include <sys/ipc.h>

key_t ftok (char*pathname, char proj);


                
              

它返回與路徑pathname相相應(yīng)的一個鍵值。該函數(shù)不直接對消息隊列操作,但在調(diào)用ipc(MSGGET,…)或msgget()來獲得消息隊列描寫敘述字前,往往要調(diào)用該函數(shù)。典型的調(diào)用代碼是:

                
                     key=ftok(path_ptr, 'a');

    ipc_id=ipc(MSGGET, (int)key, flags,0,NULL,0);

    …


                
              

2.系統(tǒng)V消息隊列API
系統(tǒng)V消息隊列API共同擁有四個,使用時須要包含幾個頭文件:

                
                  #include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>


                
              

1)int msgget(key_t key, int msgflg)

參數(shù)key是一個鍵值,由ftok獲得;msgflg參數(shù)是一些標(biāo)志位。該調(diào)用返回與健值key相相應(yīng)的消息隊列描寫敘述字。

在下面兩種情況下,該調(diào)用將創(chuàng)建一個新的消息隊列:

  • 假設(shè)沒有消息隊列與健值key相相應(yīng),而且msgflg中包括了IPC_CREAT標(biāo)志位;
  • key參數(shù)為IPC_PRIVATE;


參數(shù)msgflg能夠?yàn)橄旅妫篒PC_CREAT、IPC_EXCL、IPC_NOWAIT或三者的或結(jié)果。

調(diào)用返回: 成功返回消息隊列描寫敘述字,否則返回-1。

注:參數(shù)key設(shè)置成常數(shù)IPC_PRIVATE并不意味著其它進(jìn)程不能訪問該消息隊列,僅僅意味著即將創(chuàng)建新的消息隊列。

2)int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg);
該系統(tǒng)調(diào)用從msgid代表的消息隊列中讀取一個消息,并把消息存儲在msgp指向的msgbuf結(jié)構(gòu)中。

msqid為消息隊列描寫敘述字;消息返回后存儲在msgp指向的地址,msgsz指定msgbuf的mtext成員的長度(即消息內(nèi)容的長度),msgtyp為請求讀取的消息類型;讀消息標(biāo)志msgflg能夠?yàn)橄旅鎺讉€常值的或:

  • IPC_NOWAIT 假設(shè)沒有滿足條件的消息,調(diào)用馬上返回,此時,errno=ENOMSG
  • IPC_EXCEPT 與msgtyp>0配合使用,返回隊列中第一個類型不為msgtyp的消息
  • IPC_NOERROR 假設(shè)隊列中滿足條件的消息內(nèi)容大于所請求的msgsz字節(jié),則把該消息截斷,截斷部分將丟失。


msgrcv手冊中具體給出了消息類型取不同值時(>0; <0; =0),調(diào)用將返回消息隊列中的哪個消息。

msgrcv()解除堵塞的條件有三個:

  1. 消息隊列中有了滿足條件的消息;
  2. msqid代表的消息隊列被刪除;
  3. 調(diào)用msgrcv()的進(jìn)程被信號中斷;


調(diào)用返回: 成功返回讀出消息的實(shí)際字節(jié)數(shù),否則返回-1。

3)int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg);
向msgid代表的消息隊列發(fā)送一個消息,即將發(fā)送的消息存儲在msgp指向的msgbuf結(jié)構(gòu)中,消息的大小由msgze指定。

對發(fā)送消息來說,有意義的msgflg標(biāo)志為IPC_NOWAIT,指明在消息隊列沒有足夠空間容納要發(fā)送的消息時,msgsnd是否等待。造成msgsnd()等待的條件有兩種:

  • 當(dāng)前消息的大小與當(dāng)前消息隊列中的字節(jié)數(shù)之和超過了消息隊列的總?cè)萘浚?
  • 當(dāng)前消息隊列的消息數(shù)(單位"個")不小于消息隊列的總?cè)萘浚▎挝?字節(jié)數(shù)"),此時,盡管消息隊列中的消息數(shù)目非常多,但基本上都僅僅有一個字節(jié)。


msgsnd()解除堵塞的條件有三個:

  1. 不滿足上述兩個條件,即消息隊列中有容納該消息的空間;
  2. msqid代表的消息隊列被刪除;
  3. 調(diào)用msgsnd()的進(jìn)程被信號中斷;


調(diào)用返回: 成功返回0,否則返回-1。

4)int msgctl(int msqid, int cmd, struct msqid_ds *buf);
該系統(tǒng)調(diào)用對由msqid標(biāo)識的消息隊列運(yùn)行cmd操作,共同擁有三種cmd操作:IPC_STAT、IPC_SET 、IPC_RMID。

  1. IPC_STAT:該命令用來獲取消息隊列信息,返回的信息存貯在buf指向的msqid結(jié)構(gòu)中;
  2. IPC_SET:該命令用來設(shè)置消息隊列的屬性,要設(shè)置的屬性存儲在buf指向的msqid結(jié)構(gòu)中;可設(shè)置屬性包含:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同一時候,也影響msg_ctime成員。
  3. IPC_RMID:刪除msqid標(biāo)識的消息隊列;


調(diào)用返回: 成功返回0,否則返回-1。

----------------------------------------------------------------------------------------------------------------------

/*msgserver.c*/

#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>

#define?? MSG_FILE "msgserver.c"
#define?? BUFFER 255
#define?? PERM S_IRUSR|S_IWUSR
/* 服務(wù)端創(chuàng)建的消息隊列最后沒有刪除,我們要使用ipcrm命令來刪除的 */
/* ipcrm -q <msqid> */

struct msgtype {
??? long mtype;
??? char buffer[BUFFER+1];
};

int main()
{
??? struct msgtype msg;
??? key_t key;
??? int msgid;
???
??? if((key=ftok(MSG_FILE,'a'))==-1)
??? {
??????? fprintf(stderr,"Creat Key Error:%s/n", strerror(errno));
??????? exit(1);
??? }

??? if((msgid=msgget(key, PERM|IPC_CREAT|IPC_EXCL))==-1)
??? {
??????? fprintf(stderr, "Creat Message Error:%s/n", strerror(errno));
??????? exit(1);
??? }
??? printf("msqid = %d/n", msgid);
??? while(1)
??? {
??????? msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0);
??????? fprintf(stderr,"Server Receive:%s/n", msg.buffer);
??????? msg.mtype = 2;
??????? msgsnd(msgid, &msg, sizeof(struct msgtype), 0);
??? }
??? exit(0);
}

/* msgclient.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>

#define?? MSG_FILE "msgserver.c"
#define?? BUFFER 255
#define?? PERM S_IRUSR|S_IWUSR

struct msgtype {
??? long mtype;
??? char buffer[BUFFER+1];
};

int main(int argc, char **argv)
{
??? struct msgtype msg;
??? key_t key;
??? int msgid;
???
??? if(argc != 2)
??? {
??????? fprintf(stderr,"Usage:%s string/n", argv[0]);
??????? exit(1);
??? }
???
??? if((key=ftok(MSG_FILE,'a'))==-1)
??? {
??????? fprintf(stderr,"Creat Key Error:%s/n", strerror(errno));
??????? exit(1);
??? }
???
??? if((msgid=msgget(key, PERM))==-1)
??? {
??????? fprintf(stderr,"Creat Message? Error:%s/n", strerror(errno));
??????? exit(1);
??? }
???
??? msg.mtype = 1;
??? strncpy(msg.buffer, argv[1], BUFFER);
??? msgsnd(msgid, &msg, sizeof(struct msgtype), 0);?
??? memset(&msg, '/0', sizeof(struct msgtype));
??? msgrcv(msgid, &msg, sizeof(struct msgtype), 2, 0);
??? fprintf(stderr, "Client receive:%s/n", msg.buffer);
??? exit(0);
}??

?

linux消息隊列操作


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 九九精品久久久久久久久 | 毛片网站免费在线观看 | 成年女人视频网站免费m | 久久一级 | 视频一区国产精品 | 91色综合综合热五月激情 | 亚洲最新在线视频 | 国产成人经典三级在线观看 | 久久嫩草 | 麻豆国产在线观看一区二区 | 日本高清有码 | 久久精品国产精品青草 | 久久成人国产 | 亚洲在线免费视频 | 开心激情四房 | 九九精品在线观看 | 国产精品一区伦免视频播放 | 麻豆a| 亚洲综合成人在线 | 人人精品久久 | 五月天婷婷免费观看视频在线 | 国产在线拍揄自揄视频不卡99 | 日韩免费在线视频观看 | 精品视频www | 一区二区三区在线播放 | 免费女人18毛片a级毛片视频 | 欧美24video| 尤物福利| 久久草在线视频观看 | 日本一级欧美一级中文 | 在线成人亚洲 | 末成年一级在线看片 | 黄色在线观看免费 | 伊人精品| 久久这里只精品 | 99热这里只有成人精品国产 | 波多野野结衣1区二区 | 伊人久久在线 | 免费精品一区二区三区在线观看 | 免费h片| 亚洲小视频在线 |