zoukankan      html  css  js  c++  java
  • 消息队列通讯

    1、基本概念

    消息队列就是一个消息的链表。而一条消息则可看作一个记录,具有特定的格式。进程可以向其中按照一定的规则添加新消息;另一些进程则可以从消息队列中读走消息。也是作为IPC进程通信之一。

    2、函数学习

    1)创建或打开消息队列

    函数名:msgget

    函数原型:Int msgget(key_t key,int msgflg);

    函数功能:打开或创建消息队列

    所属头文件:<sys/ipc.h>、<sys/msg.h>、<sys/types.h>

    返回值:成功:返回消息队列的id,失败:返回-1

    参数说明:Key:消息队列的键值;Msgflg:打开标志,重要的标志IPC_CREAT:表明新创建一个消息队列

    2)发送数据

    函数名:Msgsnd

    函数原型:Int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);

    函数功能:用于发送消息到消息队列

    所属头文件:<sys/ipc.h>、<sys/msg.h>、<sys/types.h>

    返回值:成功:返回0;失败:返回-1

    参数说明:Msqid:消息队列的id;Msgp:指向要发送的消息。;Msgsz:消息的长度;Msgflg:标志

    消息结构:struct msgbuf{long mtype;//消息类型  char mtex[1];//消息数据}

    3)从消息队列中读出消息

    函数名:Msgrcv

    函数原型:Ssize_t msgrcv(int msgid,void *msgp,size_t msgsz,long msgtyp,int msgflg);

    函数功能:从消息队列中接收消息

    所属头文件:<sys/ipc.h>、<sys/msg.h>、<sys/types.h>

    返回值:成功:返回实际接收到的消息的数据长度;失败:返回-1

    参数说明:Msqid:消息队列的id;Msgp:存放取出的消息;Msgsz:希望取到消息的最大长度

    Msgtyp:消息的类型。等于0直接忽略类型,取消息队列中的第一条消息。大于0:取消息队列中类型等于msgtyp的第一条消息。小于0:取类型比msgtyp的绝对值要小或者等于的消息,如果说有多条消息满足该条件,则取类型最小的一条。

    Msgflg:标志

    4)删除消息队列

    函数原型:Int msgctl(int msgid,int cmd,struct msqid_ds *buf);

    函数功能:控制消息队列

    所属头文件:<sys/ipc.h>、<sys/msg.h>、<sys/types.h>

    返回值:成功:返回0;失败:返回-1

    参数说明:Msqid:消息队列的id;Cmd:对消息队列要执行的操作命令。IPC_RMID为删除消息队列。Buf:获取内核中的msgid_ds结构,通常不用。

     A进程

    1、从键盘获取一字符串;2、构造一则消息,放入消息队列

    B进程

    1、把消息队列中消息取出来;2、并打印消息。

    A进程工作:1、创建消息队列;2、循环:2.1获取键盘输入包括:消息类型、消息里数据;2.2构造成消息发送到消息队列。3、删除消息队列。

    B进程接收程序工作:1、打开消息队列;2、接收消息队列中的消息;3、打印消息列队中的数据;4、交给多个子进程来处理。

     send.c

    receive.c

  • 相关阅读:
    316 Remove Duplicate Letters 去除重复字母
    315 Count of Smaller Numbers After Self 计算右侧小于当前元素的个数
    313 Super Ugly Number 超级丑数
    312 Burst Balloons 戳气球
    309 Best Time to Buy and Sell Stock with Cooldown 买股票的最佳时间含冷冻期
    Java 类成员的初始化顺序
    JavaScript 全局
    HTML字符实体
    Java中的toString()方法
    JavaScript 弹窗
  • 原文地址:https://www.cnblogs.com/gary-guo/p/5579457.html
Copyright © 2011-2022 走看看