Chinaunix首页 | 论坛 | 博客
  • 博客访问: 272403
  • 博文数量: 223
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2145
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-01 10:23
个人简介

该坚持的时候坚持,该妥协的时候妥协,该放弃的时候放弃

文章分类

全部博文(223)

文章存档

2017年(56)

2016年(118)

2015年(3)

2014年(46)

我的朋友

分类: C/C++

2016-10-21 20:50:41

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

第9类 消息队列编程
9.1 创建/打开消息队列
9.1.1 函数名
Msgget
9.1.2 函数原形
Int msgget(key_t key, int msgflg);
9.1.3 函数功能
获得一个消息队列描述符
9.1.4 所属头文件
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 所属头文件
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 所属头文件
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 所属头文件
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. }


阅读(201) | 评论(0) | 转发(0) |
0

上一篇:共享内存通信

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

给主人留下些什么吧!~~