一.消息队列
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,失败返回-1
msqflg: IPC_CREAT
*/
int msgget(key_t key, int msqflg);
/*
msgsnd()发送一条消息,消息结构为:
struct msgbuf
{
long mtype; // 消息类型, 必须大于 0
char mtext[1]; // 消息数据
};
msgsnd()成功返回 0, 失败返回-1
msqsz: 指定 mtext 中有效数据的长度
msqflg:一般设置为 0 可以设置 IPC_NOWAIT
*/
int msgsnd(int msqid, const void *msqp, size_t msqsz, int msqflg);
/*
msgrcv()接收一条消息
msgrcv()成功返回 mtext 中接收到的数据长度, 失败返回-1
msqtyp: 指定接收的消息类型,类型可以为 0
msqflg: 一般设置为 0 可以设置 IPC_NOWAIT
*/
ssize_t msgrcv(int msqid, void *msgp, size_t msqsz, long msqtyp, int msqflg);
/*
msgctl()控制消息队列
msgctl()成功返回 0,失败返回-1
cmd: 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);
}