System V IPC:消息隊(duì)列

概念

  • 底層是一個(gè)鏈隊(duì)列
  • 與共享內(nèi)存的不同是:內(nèi)核要保證消息隊(duì)列的FIFO性質(zhì)枫夺,因此當(dāng)有多個(gè)接收方進(jìn)程接收消息隊(duì)列中的消息的時(shí)候昭殉,不會(huì)產(chǎn)生沖突忙干,由內(nèi)核來(lái)協(xié)調(diào)他們的執(zhí)行順序上祈。由于隊(duì)列性質(zhì)培遵,隊(duì)尾寫挣磨,隊(duì)頭讀,所以讀寫也不會(huì)存在沖突荤懂。

API和涉及的數(shù)據(jù)結(jié)構(gòu)

創(chuàng)建消息隊(duì)列
#include <sys/msg.h>
int msgget(key_t key,int flag);

參數(shù)和返回值類比共享內(nèi)存shmget

發(fā)送消息
#include <sys/msg.h>
int msgsnd(int msqid,void * ptr,size_t nbytes,int flag);

參數(shù)表:
msqid:消息隊(duì)列ID
ptr:指向待發(fā)送的消息的指針
nbytes:消息的大小
flag:當(dāng)消息隊(duì)列滿時(shí)如何處理(IPC_NOWAIT?)
返回值:
0:成功
-1:失敗

  • 消息結(jié)構(gòu)體:
    msgsnd結(jié)構(gòu)體中的ptr指向要發(fā)送的信息,此信息是一個(gè)結(jié)構(gòu)體塘砸,需要用戶自己定義节仿,但是必須包含消息類型和消息的內(nèi)容,例如下
struct mymsg
{
  long msgtype;
  char msgtext[MAXLENTH];
}
接收信息
#include <sys/msg.h>
int msgrcv(int msqid,void * ptr,size_t nbytes,long type,int flag);

參數(shù)表:
msqid:消息隊(duì)列ID
ptr:指向待發(fā)送的消息的指針
nbytes:消息的大小
type:消息類型
flag:當(dāng)消息隊(duì)列滿時(shí)如何處理(NOWAIT?)
返回值:
大于0:消息中數(shù)據(jù)部分的長(zhǎng)度
-1:失敗

  • 消息類型的用法

type = 0時(shí)掉蔬,返回隊(duì)列中的第一個(gè)消息
type > 0時(shí)廊宪,返回隊(duì)列中消息類型為type的第一個(gè)消息
type < 0時(shí),返回消息隊(duì)列中類型值小于或等于type的消息女轿,若有多個(gè)箭启,則返回最小的

注意數(shù)據(jù)大小要滿足:消息隊(duì)列定義的消息信息大小>=msgrcv中的數(shù)據(jù)大小>=msgsnd中的數(shù)據(jù)大小(即MAXLENTH>=msgrcv中nbytes>=msgsnd中的nbytes

消息隊(duì)列操作
#include <sys/msg.h>
int msg(int msqid,int cmd,struct msqid_ds * buf);

參數(shù)表:
msqid:消息隊(duì)列ID
cmd:待執(zhí)行的操作
buf:存放消息隊(duì)列屬性的內(nèi)存地址
返回值:
0:成功
-1:失敗

示例代碼

寫端:創(chuàng)建消息隊(duì)列,發(fā)送消息

#include <sys/msg.h>
#include <iostream>
#include <unistd.h>
#include <cstring>
#include <sys/ipc.h>
using namespace std;

#define MAXLENTH 128

struct msg_st
{
    int msg_type;
    char msg_text[MAXLENTH];
};

int main()
{

    int msg_id;
    int key = ftok(".",512);
    char buf[10];

    struct msg_st sndMsg;
    sndMsg.msg_type = 1;

    msg_id = msgget(key,IPC_CREAT|0666);
    if(msg_id == -1)
    {
        perror("msgget");
        exit(EXIT_FAILURE);
    }

    cin >> buf;
    strcpy(sndMsg.msg_text,buf);

    if(msgsnd(msg_id,(void *)&sndMsg,10,0)==-1)
    {
        perror("msgsnd");
        exit(EXIT_FAILURE);
    }
    sleep(10);
    return 0;
}

讀端:接收信息蛉迹,刪除消息隊(duì)列

#include <sys/msg.h>
#include <iostream>
#include <sys/ipc.h>
#include <cstring>
using namespace std;

#define MAXLENTH 128

struct msg_st
{
    int msg_type;
    char msg_text[MAXLENTH];
};

int main()
{

    int msg_id;
    int key = ftok(".",512);
    char buf[100];

    struct msg_st rcvMsg;

    msg_id = msgget(key,0666);
    if(msg_id == -1)
    {
        perror("msgget");
        exit(EXIT_FAILURE);
    }

    if(msgrcv(msg_id,(void *)&rcvMsg,20,0,0)==-1)
    {
        perror("msgrcv");
        exit(EXIT_FAILURE);
    }
    cout <<rcvMsg.msg_text <<endl;
    msgctl(msg_id,IPC_RMID,0);
    return 0;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末傅寡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子北救,更是在濱河造成了極大的恐慌荐操,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珍策,死亡現(xiàn)場(chǎng)離奇詭異托启,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)攘宙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門屯耸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蹭劈,你說(shuō)我怎么就攤上這事疗绣。” “怎么了铺韧?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵持痰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我祟蚀,道長(zhǎng)工窍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任前酿,我火速辦了婚禮患雏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘罢维。我一直安慰自己淹仑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著匀借,像睡著了一般颜阐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吓肋,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天凳怨,我揣著相機(jī)與錄音,去河邊找鬼是鬼。 笑死肤舞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的均蜜。 我是一名探鬼主播李剖,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼囤耳!你這毒婦竟也來(lái)了篙顺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤充择,失蹤者是張志新(化名)和其女友劉穎慰安,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聪铺,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡化焕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铃剔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撒桨。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖键兜,靈堂內(nèi)的尸體忽然破棺而出凤类,到底是詐尸還是另有隱情,我是刑警寧澤普气,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布谜疤,位于F島的核電站,受9級(jí)特大地震影響现诀,放射性物質(zhì)發(fā)生泄漏夷磕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一仔沿、第九天 我趴在偏房一處隱蔽的房頂上張望坐桩。 院中可真熱鬧,春花似錦封锉、人聲如沸绵跷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)碾局。三九已至荆残,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間净当,已是汗流浹背内斯。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚯瞧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓品擎,卻偏偏與公主長(zhǎng)得像埋合,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萄传,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • width: 65%;border: 1px solid #ddd;outline: 1300px solid #...
    邵勝奧閱讀 4,812評(píng)論 0 1
  • 兩種方式:1. 管道 2. 消息隊(duì)列 管道 就像現(xiàn)實(shí)中的水管甚颂,水就像數(shù)據(jù) 管道是一種半雙工的通信方式 數(shù)據(jù)只能單向...
    Yojiaku閱讀 159評(píng)論 0 0
  • { "Unterminated string literal.": "未終止的字符串文本。", "Identifi...
    栗子雨閱讀 7,882評(píng)論 0 3
  • 光陰似箭秀菱,日月如梭振诬。轉(zhuǎn)眼間二十年過(guò)去了,我已經(jīng)是一名科學(xué)家了衍菱。已經(jīng)很長(zhǎng)時(shí)間沒有回家了赶么。 ...
    李雅康閱讀 717評(píng)論 0 0
  • 今天早上乘坐地鐵,因?yàn)檎瞪习喔叻寮勾颂貏e多辫呻,我好不容易擠上去,趕緊抓住扶手琼锋。就在我握扶手的一霎那放闺,一位午輕漂亮的...
    藍(lán)天白云215閱讀 215評(píng)論 3 10