消息队列编程

1. 基本概念
消息队列就是一个消息的链 表。而一条消息则可看作一 个记录,具有特定的格式。 进程可以向中按照一定的规 则添加新消息;另一些进程 则可以从消息队列中读走消 息。

第9类 消息队列编程
9.1 创建/打开消息队列
9.1.1 函数名
Msgget
9.1.2 函数原形
Int msgget(key_t key, int msgflg);
9.1.3 函数功能
获得一个消息队列描述符
9.1.4 所属头文件
<sys/types.h> <sys/ipc.h> <sys/msg.h>
9.1.5 返回值
成功:返回消息队列的描述符id   失败:-1
9.1.6 参数说明
Key:键值
Msgflg:消息标志位,IPC_CREAT:表明新创建一个消息队列
9.1.7 范例代码

9.2 发送数据
9.2.1 函数名
Msgsnd
9.2.2 函数原形
Int msgsnd(int msqid, const void *msgp, size_t msgsz,int msgflg);
9.2.3 函数功能
发送消息到消息队列
9.2.4 所属头文件
<sys/types.h> <sys/ipc.h> <sys/msg.h>
9.2.5 返回值
成功:获取的消息内容长度  失败:-1
9.2.6 参数说明
Msqid:消息描述符id.
*msgp:指向要发送的消息
Msgsz:消息长度
Msgflg:标志位

9.3 读出消息
9.3.1 函数名
Msgrcv
9.3.2 函数原形
Ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
9.3.3 函数功能
读取消息
9.3.4 所属头文件
<sys/types.h> <sys/ipc.h> <sys/msg.h>
9.3.5 返回值
成功:0  失败:-1
9.3.6 参数说明
Msqid:消息描述符id.
*msgp:存放去除的消息
Msgsz:消息长度
Msgtyp: 消息类型 0:只取第一个消息 >0:取消息队列中类型等于msgtyp的第一条消息   <0:比msgtyp绝对值小的类型,优先取小的消息
Msgflg:标志位

9.4 控制消息队列
9.4.1 函数名
Msgctl
9.4.2 函数原形
Int msgctl(int msqid, int cmd, struct msqid_ds *buf);
9.4.3 函数功能
控制消息队列
9.4.4 所属头文件
<sys/types.h> <sys/ipc.h> <sys/msg.h>
9.4.5 返回值
成功:0  失败:-1
9.4.6 参数说明
Msqid:消息队列描述符id
Cmd:操作命令, IPC_RMID(用来删除)
*buf:获取内核中的msgid_ds结构

send.c:
  1. #include <sys/types.h>
  2. #include <sys/ipc.h>
  3. #include <sys/msg.h>

  4. struct msgt
  5. {
  6.     long msgtype;
  7.     char msgtext[1024];
  8. };

  9. int main()
  10. {
  11.     int msqid;
  12.     int msg_type;
  13.     char str[256];
  14.     struct msgt msgs;

  15.     /*创建消息队列*/
  16.     msqid = msgget(1024 , IPC_CREAT);

  17.     while(1)
  18.     {
  19.         printf("please input message type, 0 for quit!\n");
  20.     /*获取键盘输入,消息类型、消息数据*/
  21.         scanf("%d", &msg_type);
  22.     /*如果用户出入的消息类型为0,退出该循环*/
  23.         if(msg_type == 0)
  24.             break;
  25.         printf("please input message content!\n");
  26.         scanf("%s", str);

  27.         msgs.msgtype = msg_type;
  28.         strcpy(msgs.msgtext, str);
  29.     /*发送消息*/
  30.         msgsnd(msqid, &msgs, sizeof(struct msgt), 0);

  31.     }
  32.     /*删除消息队列*/
  33.     msgctl(msqid, IPC_RMID, 0);
  34. }
receive.c:
  1. #include <sys/types.h>
  2. #include <sys/ipc.h>
  3. #include <sys/msg.h>
  4. #include <unistd.h>

  5. int msqid = 0;

  6. struct msgt
  7. {
  8.     long msgtype;
  9.     char msgtext[1024];
  10. };

  11. void childprocess()
  12. {
  13.     struct msgt msgs;
  14.     while(1)
  15.     {
  16.     /*接收消息队列*/
  17.         msgrcv(msqid, &msgs, sizeof(struct msgt), 0, 0);
  18.     /*打印消息队列中的数据*/
  19.         printf("msg text: %s \n", msgs.msgtext);
  20.     }
  21.     return;
  22. }

  23. void main()
  24. {
  25.     pid_t cpid;
  26.     int i;
  27.     /*打开消息队列*/
  28.     msqid = msgget(1024, IPC_EXCL);
  29.     /*创建3个子进程*/
  30.     for(i=0;i<3;i++)
  31.     {
  32.         cpid = fork();
  33.         if(cpid < 0)
  34.             printf("creat child process error!\n");
  35.         else if(cpid == 0)
  36.             childprocess();
  37.     }
  38. }


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(70) | 评论(0) | 转发(0) |
0

上一篇:共享内存通信

下一篇:多线程互斥和同步

给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

习惯就好zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值