消息队列编程
消息队列通讯
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_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 }