消息隊列就是一個消息的連結清單,而一條消息則可看作一個記錄,具有特定的格式,
程序可以向其中按照一定的規則添加新消息;另一些程序則可以從消息隊列中讀走消息。相當于生産者和消費者。
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();
}
}
}