进程编程——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进程间的消息队列通信的主要内容,如果未能解决你的问题,请参考以下文章

多进程编程之进程间通信-管道和消息队列

LInux进程间通信之消息队列编程实例

linux 进程间通信方式

Linux间进程通信--消息队列

Linux间进程通信--消息队列

linux进程间的通信(C): 消息队列