进程编程——msg进程间的消息队列通信
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程编程——msg进程间的消息队列通信相关的知识,希望对你有一定的参考价值。
【进程编程】——msg进程间的消息队列通信
消息队列就像一个链表,先进先出,就像排队打饭,先到先买!
键值 用来获取消息队列的描述字,我感觉就像是一个定位标识符!
函数一 key_t ftok(char *pathname,char proj)
返回的是一个键值------>创建队列之前一定要获取这个键值!
proj:项目名,不为零即可
打开、创建
函数二 int msgget(key_t key,int msgflg) //看见没,这里是要求键值的。
key:键值 由ftok获得
msgflg: 标志
返回值: 与键值key相对应的消息队列描述字。
IPC_CREAT 创建新的消息队列
IPC_EXCL 如果要创建的消息队列已经存在,就反回一个错误.
IPC_NOWAIT 读写消息队列无法的到满足时,不阻塞
创建条件
1、在创建的过程中,没有于key值相对应的,且msgflg为IPC_CREAT-------->也就是说在创建之前没有已生成的键值,是第一次!
2、key的参数为IPC_PRIVATE.
发送消息
函数三 int msgsnd(int msqid ,struct msgbuf*msgp ,int msgsz ,int msgflg)
msqid 以打开的消息队列id
msgp 存放消息的结构
msgsz 消息数据长度
msgflg发送消息标志,有意义的msfflg标志为IPC_NOWAIT,
指明在消息队列没有足够空间的时候要发送消息是msgsnd是否等待
消息格式
struct msgbuf{
long mtype;消息类型
char mtext; 消息数据首地址
};
接受消息
函数四 int msgrcv (int msqid,struct msgbuf *msgp,int msgsz,long msgtyp,int msgflg)
读取后消息被删除
/**********消息队列的具体实现*******************/
该程序实现创建一个消息队列,然后把结构体中的数据送到消息队列里,然后格式化结构体
数据,最后通过消息队列的消息发送到数据结构体中,把数据打印出来!!
/**********************************************************/
#include <sys/types.h>
#include <sys/msg.h>
#include <unistd.h>
struct msg_buf //定义一个结构体用来存储消息队列的内容
{
int mtype; //类型,一般发送和接收的一样
char data[255]; //队列内容
};
int main()
{
key_t key;
int msgid;
int ret;
struct msg_buf msgbuf; // 初学数据结构的化应该理解,定义结构体变量
key=ftok("/tmp/2",‘a‘); //创建一个消息队列的键值,第一个参数是路径,第二个是项目名不为零即可
printf("key =[%x]\n",key);
msgid=msgget(key,IPC_CREAT|0666); /*通过文件对应 通过创建的键值,来创建消息队列*/
if(msgid==-1) //返回一,创建失败
{
printf("create error\n");
return -1;
}
msgbuf.mtype = getpid(); //类型设置进程号,接收和发送一定要一样;
strcpy(msgbuf.data,"test haha"); ,//拷贝内容到,结构体数据库
ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT); //发送结构体数据到消息到队//列,参数1消息队列地址
if(ret==-1) //参数2结构体地址 3是数据长度,等待补阻塞
{
printf("send message err\n");
return -1;
}
memset(&msgbuf,0,sizeof(msgbuf)); 清空结构体,然后在使用,这时结构体没有数据,下面就是把消息队列的内容在返回给结构体。
ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),getpid(),IPC_NOWAIT);将消息队列msgid里的内容接收到结构体中
if(ret==-1)
{
printf("recv message err\n");
return -1;
}
printf("recv msg =[%s]\n",msgbuf.data); 最后又把信息打印了出来,回了一个圈,哈哈哈!
}
你看懂了没--------------------------------------------------------->>>>>>>>>cheer up!
以上是关于进程编程——msg进程间的消息队列通信的主要内容,如果未能解决你的问题,请参考以下文章