【进程编程】——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!

 

时间: 2024-10-23 08:47:03

【进程编程】——msg进程间的消息队列通信的相关文章

Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> 参考:C和指针学习 说明:本文非常的长,也是为了便于查找和比较,所以放在一起了 Linux 传统的进程间通信有很多,如各类管道.消息队列.内存共享.信号量等等.但它们都无法介于内核态与用户态使用,原因如表 通信方法 无法介于内核态与用户态的原因 管道(不包括命名管道) 局限于父子进程间的通信. 消息队列 在

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

1.进程间通信 Linux作为一种新兴的操作系统,几乎支持所有的Unix下常用的进程间通信方法:管道.消息队列.共享内存.信号量.套接口等等. 2.2.1 管道 管道是进程间通信中最古老的方式,它包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者用于运行于同一台机器上的任意两个进程间的通信. 无名管道pipe 无名管道由pipe()函数创建: #include <unistd.h> int pipe(int filedis[2]): 参数filedis返回两个文件描述符:file

进程间通信之消息队列通信

概念 消息队列 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列也有管道一样的不足,就是每条消息的最大长度是有上限的(MSGMAX),每个消息队列的总字节数(内核缓冲上限)是有上限的(MSGMNB),系统上消息队列的总数(消息条目数)也有一个上限(MSGMNI) 对比: 管道 消息 流管道 有边界 先进先出 可以后进入.先出来 消息大小三大限制 cat /proc/sys/kernel/msgmax最

【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)

在网络课程中,有讲到Socket编程,对于tcp讲解的环节,为了加深理解,自己写了Linux下进程Socket通信,在学习的过程中,又接触到了其它的几种方式.记录一下. 管道通信(匿名,有名) 管道通信,在一个进程之中,只能单一的对其写或者是读,而不可以及执行写操作又执行读操作.这一点,我们可以将其想象成我们的水管,分别连着不同的两端,在有水流的时候,一端只能进行输入,另一端只能进行输出,而不可以同时输入和输出. 管道又分为有名管道和匿名管道,两者的区别在于对于匿名管道,其只能在具有亲缘关系的父

进程组间通讯(消息队列)

1.所有进程共用一个消息队列组. 2.消息队列组里面包含一个发送消息队列和一个接收消息队列. 3.请求进程主动向发送消息队列发送消息,从接收消息队列接收消息.处理进程从发送消息队列读取请求,向接收队列发送处理结果. 4.同一进程组都是相同的进程. 5.处理进程组内的所有进程以竞争的方式从消息队列内读取请求. 5.要实现的功能是向进程组发送消息,得到处理结果.从发送请求的进程的角度来说,只需要知道发送给哪个进程组即可.从接收进程的角度来说,需要知道请求是从哪一个进程发来的才能准确地把请求结果返回.

[转]Linux进程通信之POSIX消息队列

进程间的消息队列可以用这个实现,学习了下. http://blog.csdn.net/anonymalias/article/details/9799645?utm_source=tuicool&utm_medium=referral 消息队列是Linux IPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据. 消息队列和之前讨论过的管道和FIFO有很大的区别,主要有以下两点: 一个进程向消息队列写入消息之前,并不需要某个进程在该队列上等待该消息的到达,而管道和FIFO是相

进程-IPC 共享内存和消息队列 (三)

详见:https://github.com/ZhangzheBJUT/linux/blob/master/IPC(%E4%B8%89).md 五 共享内存 5.1. 共享内存简介 共享内存指多个进程共享同一块物理内存,它只能用于同一台机器上的两个进程之间的通信.在进程的逻辑地址空间中有一段地址范围是用来进行内存映射使用的,该段逻辑地址空间可以映射到共享的物理内存地址上(进程空间介绍:http://blog.csdn.net/zhangzhebjut/article/details/3906025

【Linux】 进程通信--消息队列

一.概念 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值.我们可以通过发送消息 来避免命名管道的同步和阻塞问题.消息队列与管道不同的是,消息队列是基于消息的, 而管道是基于字节流的,且消息队列的读取不?定是先入先出.消息队列与命名管道有一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有?个上限(MSGMNI). 查看机

Linux 消息队列编程

消息队列.信号量以及共享内存被称作 XSI IPC,它们均来自system V的IPC功能,因此具有许多共性. 键和标识符: 内核中的每一种IPC结构(比如信号量.消息队列.共享内存)都用一个非负整数的标识符加以标示(如共享内存的shmid.信号量的semid.以及消息队列的msgid).不同于文件描述符,IPC标识符不是一个小的非负整数,它是一个int型的整数,当一个标识符被创建,以后又被删除时,这个整数持续加1,达到整型的最大值后,重新回到0. 但是每一个IPC对象在内核中的标识符只能在内部