一.消息队列
1.消息队列:消息队列为一个进程向另一个进程发送一个数据块提供了条件,每个数据块会包含一个类型。
2.相关函数
1>.msgget(key_t key,int msgflg) : 创建消息队列
2>. msgsnd:把消息添加到消息队列
3>.msgrcv :从一个消息队列中获取信息
3.代码示例
#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>/*msgget()创建或者获取一个消息队列msgget()成功返回消息队列 ID,失败返回-1msqflg: IPC_CREAT*/int msgget(key_t key, int msqflg); /*msgsnd()发送一条消息,消息结构为:struct msgbuf{long mtype; // 消息类型, 必须大于 0char mtext[1]; // 消息数据};msgsnd()成功返回 0, 失败返回-1msqsz: 指定 mtext 中有效数据的长度msqflg:一般设置为 0 可以设置 IPC_NOWAIT*/int msgsnd(int msqid, const void *msqp, size_t msqsz, int msqflg); /*msgrcv()接收一条消息msgrcv()成功返回 mtext 中接收到的数据长度, 失败返回-1msqtyp: 指定接收的消息类型,类型可以为 0msqflg: 一般设置为 0 可以设置 IPC_NOWAIT*/ssize_t msgrcv(int msqid, void *msgp, size_t msqsz, long msqtyp, int msqflg); /*msgctl()控制消息队列msgctl()成功返回 0,失败返回-1cmd: IPC_RMID*/int msgctl(int msqid, int cmd, struct msqid_ds *buf);
a.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/msg.h>struct mess
{long type;char buff[128];
};int main()
{int msgid = msgget((key_t)1234,IPC_CREAT|0600);if(msgid == -1){exit(0);}struct mess m;m.type = 2;char s[128] = {0};printf("input: ");fgets(s,128,stdin);strcpy(m.buff,s);msgsnd(msgid,&m,128,0);//添加数据 exit(0);
}
b.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/msg.h>struct mess
{long type;char buff[128];
};int main()
{int msgid = msgget((key_t)1234,IPC_CREAT|0600);if(msgid == -1){exit(0);}struct mess m;msgrcv(msgid,&m,128,2,0);printf("read msg =%s\n",m.buff);exit(0);
}