天天看點

linux消息隊列介紹

消息隊列就是一個消息的連結清單,而一條消息則可看作一個記錄,具有特定的格式,

程序可以向其中按照一定的規則添加新消息;另一些程序則可以從消息隊列中讀走消息。相當于生産者和消費者。

int msgget(key_t key,int msgflg)

函數功能:打開或建立消息隊列

傳回值:成功:傳回消息隊列ID,失敗傳回-1

參數:key是一個鍵值,msgflg是一個打開标志,IPC_CREAT:表示當key不存在時,建立一個新的消息隊列。

int msgsnd(int msgid,const void *msgp,size_t msgsz,int msgflg)

函數功能:發送消息到消息隊列

傳回值:成功時傳回0,失敗時傳回-1

參數:msgid:表示消息隊列的id,msgp:這個指針指向需要發送的消息,msgsz:表示消息的真實大小,不包括消息類型。

ssize_t msgrcv(int msgid,void *msgp,size_t msgsz,long msgtype,int msgflg )

函數功能:從消息隊列中接受一條消息

傳回值:成功時傳回接收到的實際消息長度,失敗時傳回-1

參數:msgid:消息隊列的id,msgp:存放取出的消息,msgsz:取到的消息的最大長度,msgtype:消息的類型,為0時,忽略消息類型,直接取消息隊列中的第一條消息,msgtype大于0時,取消息隊列中類型等于msgtype的第一條消息,msgtype<0時,取類型比msgtype的絕對值要小或者等于的消息,如果有多條消息滿足此條件,則取類型最小的一條消息。msgflg :消息隊列類型。

int msgctl(int msgid,int cmd, struct msgid_ds *buf)

函數功能:根據cmd對消息進行操作,

傳回值:成功時傳回0,失敗時傳回-1;

參數:msgid:消息對列id,cmd:對消息進行一些操作的指令,比如:IPC_RMID:表示删除消息,buf:擷取核心中的msgid_id結構。

參考執行個體:

//編譯:gcc -g send.c -o send

#include<stdio.h>

#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/msg.h>

//消息結構體

struct msgt

{

    long msgtype;

    char msgtext[1024];    

};

int main()

{

    int msgid;

    int msg_type;

    char str[512];

    struct msgt msgs;

    msgid=msgget(1024,IPC_CREAT);

    while(1)

    {

        printf("please input type,0 for quit:");

        scanf("%d",&msg_type);    

        if(msg_type == 0)

        {

            break;    

        }

        printf("please input message content\n");

        scanf("%s",str);

        msgs.msgtype = msg_type;

        strcpy(msgs.msgtext,str);

        msgsnd(msgid,&msgs,sizeof(struct msgt),0);

    }

    msgctl(msgid,IPC_RMID,0);

    return 0;

}

//gcc -g recv.c -o recv

#include<stdio.h>

#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/msg.h>

int msgid = 0;

struct msgt

{

    long msgtype;

    char msgtext[1024];    

};

//子程序處理接收到的消息

void childprocess()

{

    struct msgt msgs;

    while(1)

    {

        msgrcv(msgid,&msgs,sizeof(struct msgt),0,0);  //0:表示消息隊列的第一條消息

        printf("msg content is %s\n",msg.msgtext);

    }

    return;

}

void main()

{

    int i;

    int cpid;

    msgid=msgget(1024,IPC_CREAT);

    for(i=0;i<10;i++)

    {

        cpid = fork();  //建立子程序

        if(cpid < 0)

        {

            printf("create child process is error:\n");

        }

        else if(cpid == 0)

        {

            childprocess();

        }    

    }

}

繼續閱讀