1、消息队列的创建
msgget(key_t key,//相当于文件名
int flag);//打开:0,创建:IPC_CREAT|0644
返回值:消息队列的id。相当于文件描述符
查看IPC对象
ipcs -q:查看系统所有的创建的消息队列
删除IPC对象:
ipcrm -Q key
系统中最多创建多少个消息队列(MSGNMI);
cat /proc/sys/kernel/msgmni
每个消息队列的长度是有上限的()
cat /proc/sys/kernel/msgmax
一条消息最多能装多少字节()
cat /proc/sys/kernel/msgmnb
2、往消息队列里面发送数据:
msgsnd(int id ,//msgget的返回值
const void *msgp,//要发送的消息在哪里
size_t len,//消息的字节数,不包括channel的大小
int flag);//失败返回-1,成功返回0
消息的结构:
struct msgbuf{
long channel;//消息类型(通道号),必须>=1
char buf【1000】;//代表自己要发送的消息的数据结构,类型自定义
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
struct msgbuf {//关于消息的结构体
long type;
char mtext[1000];
};
int main(int argc,char *argv[])//命令行的第二个参数就是通道号
{
if(argc!=2){//命令行参数
fprintf(stderr,"usage:%s type\n",argv[0]);
exit(1);
}
int id=msgget(1234,0);//id为msgget的返回值
if(id==-1) perror("msgget"),exit(1);
struct msgbuf mb;
memset(&mb,0x00,sizeof mb);
mb.type=atoi(argv[1]);//通道号
printf("msg:");
fgets(mb.mtext,999,stdin);//向消息队列中输入内容
int r=msgsnd(id,&mb,strlen(mb.mtext),0);
if(r==-1) perror(",msgsnd"),exit(1);//根据返回值判断消息发送是否成功
}
3、从消息队列中取数据:
msgrcv(int id,
void *msgp,//取出的消息放在这里
size_t len,//装消息的地方的大小,不包括类型
long mytype//取哪个类型的数据
int flag);//0,有就取走,没有就等待
先发送消息,再接受消息,如果在相应的通道没有消息,则接收消息就一直等待,知道有了可供接收的消息。
struct msgbuf {
long type;
char mtext[1000];
};
int main(int argc,char *argv[])
{
if(argc!=2){
fprintf(stderr,"usage:%s type\n",argv[0]);
exit(1);
}
int id=msgget(1234,0);
if(id==-1) perror("msgget"),exit(1);
struct msgbuf mb;
memset(&mb,0x00,sizeof mb);
if(msgrcv(id,&mb,1000,atoi(argv[1]),0)==-1)//接收数据
perror("msgrcv"),exit(1);
printf("%s\n",mb.mtext);//输出消息队列中的数据
}