码迷,mamicode.com
首页 > 其他好文 > 详细

消息队列编程

时间:2016-02-28 00:51:07      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:

消息队列编程

消息队列通讯

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!\n");
25         //获取消息类型
26         scanf("%d",&msg_type);
27         //如果用户输入的消息类型为0,退出该循环
28         if(msg_type == 0)
29         {
30             break;
31         }
32         //获取消息数据
33         printf("please input message content\n");
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\n",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!\n");
42         }
43         else if(cpid == 0)
44         {
45             childprocess();
46         }
47     }
48     
49     return 0;
50 }
msg_queue_receive.c

 

消息队列编程

标签:

原文地址:http://www.cnblogs.com/love-linux/p/5223858.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!