日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux消息队列操作

發布時間:2025/3/20 linux 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux消息队列操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

1、 打開或創建消息隊列
消息隊列的內核持續性要求每一個消息隊列都在系統范圍內相應唯一的鍵值,所以,要獲得一個消息隊列的描寫敘述字,僅僅需提供該消息隊列的鍵值就可以;

注:消息隊列描寫敘述字是由在系統范圍內唯一的鍵值生成的,而鍵值能夠看作相應系統內的一條路經。

2、 讀寫操作

消息讀寫操作很easy,對開發者來說,每一個消息都相似例如以下的數據結構:

struct msgbuf{ long mtype; char mtext[1]; };

mtype成員代表消息類型,從消息隊列中讀取消息的一個重要根據就是消息的類型;mtext是消息內容,當然長度不一定為1。因此,對于發送消息來說,首先預置一個msgbuf緩沖區并寫入消息類型和內容,調用對應的發送函數就可以;對讀取消息來說,首先分配這樣一個msgbuf緩沖區,然后把消息讀入該緩沖區就可以。

3、 獲得或設置消息隊列屬性:

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



消息隊列API

1、文件名稱到鍵值

#include <sys/types.h> #include <sys/ipc.h> key_t ftok (char*pathname, char proj);

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

key=ftok(path_ptr, 'a');ipc_id=ipc(MSGGET, (int)key, flags,0,NULL,0);…

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

#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>

1)int msgget(key_t key, int msgflg)

參數key是一個鍵值,由ftok獲得;msgflg參數是一些標志位。該調用返回與健值key相相應的消息隊列描寫敘述字。

在下面兩種情況下,該調用將創建一個新的消息隊列:

  • 假設沒有消息隊列與健值key相相應,而且msgflg中包括了IPC_CREAT標志位;
  • key參數為IPC_PRIVATE;


參數msgflg能夠為下面:IPC_CREAT、IPC_EXCL、IPC_NOWAIT或三者的或結果。

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

注:參數key設置成常數IPC_PRIVATE并不意味著其它進程不能訪問該消息隊列,僅僅意味著即將創建新的消息隊列。

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

msqid為消息隊列描寫敘述字;消息返回后存儲在msgp指向的地址,msgsz指定msgbuf的mtext成員的長度(即消息內容的長度),msgtyp為請求讀取的消息類型;讀消息標志msgflg能夠為下面幾個常值的或:

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


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

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

  • 消息隊列中有了滿足條件的消息;
  • msqid代表的消息隊列被刪除;
  • 調用msgrcv()的進程被信號中斷;

  • 調用返回:成功返回讀出消息的實際字節數,否則返回-1。

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

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

    • 當前消息的大小與當前消息隊列中的字節數之和超過了消息隊列的總容量;
    • 當前消息隊列的消息數(單位"個")不小于消息隊列的總容量(單位"字節數"),此時,盡管消息隊列中的消息數目非常多,但基本上都僅僅有一個字節。


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

  • 不滿足上述兩個條件,即消息隊列中有容納該消息的空間;
  • msqid代表的消息隊列被刪除;
  • 調用msgsnd()的進程被信號中斷;

  • 調用返回:成功返回0,否則返回-1。

    4)int msgctl(int msqid, int cmd, struct msqid_ds *buf);
    該系統調用對由msqid標識的消息隊列運行cmd操作,共同擁有三種cmd操作:IPC_STAT、IPC_SET 、IPC_RMID。

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

  • 調用返回:成功返回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
    /* 服務端創建的消息隊列最后沒有刪除,我們要使用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消息队列操作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 精品黑人一区二区三区国语馆 | caoporn视频在线 | 国产精品揄拍100视频 | 欧美日韩四区 | 国产情侣在线视频 | 亚洲午夜视频在线 | 黄片一区二区 | 波多野结衣网站 | 国产精品自拍在线观看 | 中文字幕视频网 | 国产成人77亚洲精品www | 日本91av| 中文字幕日本视频 | 婷婷资源网 | 亚洲h在线观看 | 亚洲乱码一区二区 | 午夜一区二区三区在线观看 | 国产精品久久久久9999爆乳 | 一区二区韩国 | 亚洲一区二区三区网站 | 日本黄色xxx | 一级黄色片网站 | 成人在线精品视频 | 亚洲成人免费在线视频 | 久久久黄色片 | 国产精品探花在线观看 | 精品国产鲁一鲁一区二区张丽 | 国产精品日韩专区 | 国产综合婷婷 | 亚洲三级av| 催眠调教艳妇成肉便小说 | 就要操av| 中文字幕日韩欧美一区二区三区 | 成人在线视频免费播放 | 蜜桃tv在线观看 | 黄在线观看免费 | 超碰人人干| 欧美日韩久久 | 午夜激情国产 | 亚洲一区二区三区在线观看视频 | 亚洲一区在线免费观看 | 国产在线精品一区二区 | 久久成人综合网 | 久久久久久久国产精品美女 | 亚洲综合少妇 | 久久久久成人精品无码中文字幕 | 91视频亚洲 | 国内精品一区二区三区 | 91社区福利 | 日韩人妻精品在线 | 人人草人人射 | 97影院手机版 | 日韩视频在线观看二区 | 亚洲区小说 | 美女mm131爽爽爽免费动视频 | a视频在线观看免费 | 国产美女精品 | 免费涩涩网站 | 亚洲国产精品视频 | 免费日本黄色 | 岳狂躁岳丰满少妇大叫 | 黄色一及片 | 久久久久久九九九 | 亚洲av人人澡人人爽人人夜夜 | 人妻久久一区二区 | 在线黄网| 台湾性dvd性色av | av中字 | 欧美国产日韩一区 | 欧美日韩中文字幕一区 | 麻豆一区二区三区四区 | 天天干夜夜骑 | 久久福利网 | 欧洲成人av | 美女屁股网站 | 一区二区三区 欧美 | 国产精品99999 | 欧美一区二区三区成人精品 | 国产精品第一页在线观看 | 精品不卡在线 | 91视频日本 | 中文字幕日韩经典 | 国语对白一区二区三区 | 另类少妇人与禽zozz0性伦 | 亚洲美女性生活视频 | 日本黄区免费视频观看 | 毛片高清免费 | 亚洲国产精品久久久久 | 六月丁香久久 | 美女激情网 | 成人激情免费视频 | 性生活三级视频 | 极品白嫩少妇无套内谢 | 国产酒店自拍 | 久久久精品人妻无码专区 | 亚洲夜夜爽 | 动漫美女被吸奶 | 老女人乱淫 | 在线欧美亚洲 |