進程通信消息隊列代碼及一些注意點

發送方

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>

#define MAXLENGTH 80

struct msg_st
{
    long msgtype;
    char text[MAXLENGTH];
};

int main()
{
    int msgid,i;
    char *snddata[4]={"Hello,world!","Prepare to rcv data!","Data is 1234!","end"};
    struct msg_st msgsnddata;

    msgid = msgget((key_t)1234,06666|IPC_CREAT);
    if(msgid == -1)
        exit(0);

    while(i<4)
    {
        msgsnddata.msgtype = 1;
        strcpy(msgsnddata.text,snddata[i]);
        msgsnd(msgid,&msgsnddata,MAXLENGTH,0);
        i++;
    }

    return 0;
}

#define MAXLENGTH 80約定消息隊列中每條消息的最大長度,不可以超過系統規定的最大長度。

struct msg_st
{
long msgtype;
char text[MAXLENGTH];
};
約定每條消息的格式。long msgtype必須要有表示消息類型。text爲內容,可以自己定義其它形式如int。

msgget((key_t)1234,06666|IPC_CREAT)中1234位消息隊列的key,接收方需要使用。0666表示有讀寫權限,IPC_CREAT不存在則創建。

msgsnd(msgid,&msgsnddata,MAXLENGTH,0);中&msgsnddata爲指針,MAXLENGTH數據長度,常用0

strcpy(msgsnddata.text,snddata[i]);將snddata[i]複製給前面,均爲指針。

接收方

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/msg.h>

#define MSGLENGTH 80

struct msg_st
{
    long msgtype;
    char text[MSGLENGTH];
};

int main()//receive msg
{
    int msgid,msgtype;
    struct msg_st rcvdata;

    msgid = msgget((key_t)1234,0666|IPC_CREAT);
    if(msgid == -1)
    {
        printf("error msgget!\n");
        exit(0);
    }

    msgtype = 0;//rcv first msg from queue
    while(1)
    {
        msgrcv(msgid,&rcvdata,MSGLENGTH,msgtype,0);
        if(strcmp(rcvdata.text,"end") == 0)
            break;
        else
            printf("%s\n",rcvdata.text);
    }


    if(msgctl(msgid,IPC_RMID,0) == -1)//close msg queue
    {
        printf("error msgctl!\n");
        exit(0);
    }

    return 0;
}

需要循環讀取消息隊列,msgrcv(msgid,&rcvdata,MSGLENGTH,msgtype,0);
msgtype爲0表示每次讀取第一條。數據讀完就沒了。

msgctl(msgid,IPC_RMID,0)讀完數據後關閉消息隊列。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章