消息队列编程

消息队列编程

消息队列通讯

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

 

转载于:https://www.cnblogs.com/love-linux/p/5223858.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值