• 消息队列编程


    消息队列编程

    消息队列通讯

    11.1 创建、打开消息队列

    11.1.1 函数名

    msgget

    11.1.2 函数原形

    Int msgget(key_t key,int msgflg)

    11.1.3 函数功能

    打开或者创建消息队列

    11.1.4 所属头文件

    <sys/tpes.h>

    <sys/ipc.h>

    <sys/msg.h>

    11.1.5 返回值

    成功:返回消息队列id

    失败:-1

    11.1.6 参数说明

    Key:键值

    Msgflg:打开标志。IPC_CREAT:表明新创建一个消息队列

    11.2 发送数据

    11.1.1 函数名

    msgsnd

    11.1.2 函数原形

    Int msgsnd(int msgid,const void *msgp,size_t msgsz,int msgflg)

    11.1.3 函数功能

    发送消息到消息队列

    11.1.4 所属头文件

    <sys/types.h>

    <sys/ipc.h>

    <sys/msg.h>

    11.1.5 返回值

    成功:0

    失败:-1

    11.1.6 参数说明

    Msgid:消息队列的id

    Msgp:指向要发送的消息

    Msgsz:消息的长度

    Msgflg:标志位

    11.3 从消息队列中取消息

    11.3.1 函数名

    msgrcv

    11.3.2 函数原形

    Ssize_t msgrcv(int msgid,void *msgp,size_t msgsz,long msgtyp,int msgflg)

    11.3.3 函数功能

    从消息队列中接收消息

    11.3.4 所属头文件

    <sys/types.h>

    <sys/ipc.h>

    <sys/msg.h>

    11.3.5 返回值

    成功:实际接收到的消息的数据长度

    失败:-1

    11.3.6 参数说明

    Msgid:消息队列的id

    Msgp:存放取出的消息

    Msgsz:希望取到的消息的对打长度

    Msgtyp:消息的类型。

    0:忽略类型,直接取队列中的第一条消息。

    >0:取消息队列中类型等于msgtyp的第一条消息

    <0:取类型比msgtyp的绝对值要小或者等于的消息,如果有多条消息满足该条件,则取类型最小的一条。

    Msgflg:标志

    11.4 删除消息队列

    11.4.1 函数名

    msgctl

    11.4.2 函数原形

    Int msgctl(int msqid,int cmd,struct msqid_ds *buf)

    11.4.3 函数功能

    控制消息队列

    11.4.4 所属头文件

    <sys/types.h>

    <sys/ipc.h>

    <sys/msg.h>

    11.4.5 返回值

    成功:0

    失败:-1

    11.4.6 参数说明

    Msqid:消息队列的id

    Cmd:对消息队列执行的操作命令,IPC_RMID用于删除消息队列

    Buf:获取内核中的msqid_ds结构

    msg_queue_send.c

     1 #include <stdio.h>
     2 #include <sys/types.h>
     3 #include <sys/ipc.h>
     4 #include <sys.msg.h>
     5 
     6 struct msgt
     7 {
     8     long msgtype;
     9     char msgtext[1024];
    10 };
    11 
    12 int main()
    13 {
    14     int msqid;
    15     int msg_type;
    16     //创建消息队列
    17     msqid = msgget(1024,IPC_CREAT);
    18     char str[256];
    19     struct msgt msgs;
    20     
    21     //循环
    22     while(1)
    23     {
    24         printf("please input message type,0 for quit!
    ");
    25         //获取消息类型
    26         scanf("%d",&msg_type);
    27         //如果用户输入的消息类型为0,退出该循环
    28         if(msg_type == 0)
    29         {
    30             break;
    31         }
    32         //获取消息数据
    33         printf("please input message content
    ");
    34         scanf("%s",str);
    35         msgs.type = msg_type;
    36         strcpy(msgs.msgtext,str);
    37         //发送消息
    38         msgsnd(msqid,&msgs,sizeof(struct msgt),0);
    39         
    40     }
    41 
    42     msgctl(msqid,IPC_RMID,0);
    43     //删除消息队列
    44 
    45     return 0;
    46 
    47 }
    msg_queue_send.c

    msg_queue_receive.c

     1 #include <stdio.h>
     2 #include <sys/ipc.h>
     3 #include <sys/types.h>
     4 #include <sys/msg.h>
     5 
     6 int msqid = 0;
     7 
     8 struct msgt
     9 {
    10     long msgtype;
    11     char msgtext[1024];
    12 };
    13 void childprocess()
    14 {
    15     struct msgt msgs;
    16 
    17     while(1)
    18     {
    19         //接收消息队列
    20         msgrcv(msqid,&msgs,sizeof(struct msgt),0,0);
    21     
    22         //打印消息队列中的数据
    23         printf("msg text: %s
    ",msgs.msgtext);
    24     }
    25     return;
    26 }
    27 
    28 int main()
    29 {
    30     int i;
    31     int cpid;
    32     //打开消息队列
    33     msqid = msgget(1024,IPC_EXCL);
    34 
    35     //创建3个子进程
    36     for(i=0;i<3;i++)
    37     {
    38         cpid = fork();
    39         if(cpid < 0)
    40         {
    41             printf("creat child process error!
    ");
    42         }
    43         else if(cpid == 0)
    44         {
    45             childprocess();
    46         }
    47     }
    48     
    49     return 0;
    50 }
    msg_queue_receive.c
  • 相关阅读:
    hdu4717 The Moving Points(二分做法)
    C++中用rand()和srand()产生随机数方法介绍
    教你看懂C++类库函数定义之一---HRESULT 宏
    [置顶] IOS培训资料
    调试出不来 断点不起作用 调试技巧 MyEclipse进不了调试
    [置顶] 编程模仿boost::function和boost::bind
    模拟红外协议接收程序
    Java 使用JDBC、DBCP、C3P0访问数据库
    Linux点亮一个灯
    Makefile解析(最简单的LED)
  • 原文地址:https://www.cnblogs.com/love-linux/p/5223858.html
Copyright © 2020-2023  润新知