18 消息队列3
来源:互联网 发布:大数据市场调研 编辑:程序博客网 时间:2024/05/27 01:37
1. 举例实现无亲缘关系的进程间如何进行通信。
消息队列不像共享内存的流程,它不需要信号通知。
消息队列的另一个特点:信息读取完自动删除;可以阻塞
2. 示例一,单向通信
Write.c
#include "sys/types.h"#include "sys/msg.h"#include "signal.h"#include "unistd.h"#include "stdio.h"#include "stdlib.h"#include "string.h"struct msgbuf{ long type; char voltage[124]; char ID[4];};int main(){ int msgid; int readret; int key; struct msgbuf sendbuf,recvbuf; key=ftok("./b.c",'a'); if(key < 0) { printf("creat key failure\n"); return -2; } msgid=msgget(key,IPC_CREAT|0777); if(msgid <0) {printf("creat message queue failure\n");return -1; } printf("creat message queue sucess msgid=%d\n",msgid); system("ipcs -q"); sendbuf.type=100; //write message queue while(1) { memset(sendbuf.voltage,0,124);//clear send buffer printf("please input message:\n"); fgets(sendbuf.voltage,124,stdin); //start write message to message queue msgsnd(msgid,(void *)&sendbuf,strlen(sendbuf.voltage),0); } msgctl(msgid,IPC_RMID,NULL); system("ipcs -q"); return 0;}
执行结果:
alex@alex-VirtualBox:~/Share/process/eighteen$ ./writecreat message queue sucess msgid=65537------ Message Queues --------key msqid owner perms used-bytes messages0x00000000 32768 alex 777 0 00x61016518 65537 alex 777 0 0please input message:helloplease input message:hiplease input message:
Read.c
#include "sys/types.h"#include "sys/msg.h"#include "signal.h"#include "unistd.h"#include "stdio.h"#include "stdlib.h"#include "string.h"struct msgbuf{ long type; char voltage[124]; char ID[4];};int main(){ int msgid; int readret; int key; struct msgbuf sendbuf,recvbuf; key=ftok("./b.c",'a'); if(key < 0) { printf("creat key failure\n"); return -2; } msgid=msgget(key,IPC_CREAT|0777); if(msgid <0) {printf("creat message queue failure\n");return -1; } printf("creat message queue sucess msgid=%d\n",msgid); system("ipcs -q"); //read message queue while(1) { memset(recvbuf.voltage,0,124);//clear receive buffer //start read message from message queue msgrcv(msgid,(void *)&recvbuf,124,100,0); printf("receive data from message queue:%s",recvbuf.voltage); } msgctl(msgid,IPC_RMID,NULL); system("ipcs -q"); return 0;}
执行结果:
alex@alex-VirtualBox:~/Share/process/eighteen$ ./readcreat message queue sucess msgid=65537------ Message Queues --------key msqid owner perms used-bytes messages0x00000000 32768 alex 777 0 00x61016518 65537 alex 777 0 0receive data from message queue:helloreceive data from message queue:hi
3. 示例二,双向通信,类似于聊天工具
Server.c
#include "sys/types.h"#include "sys/msg.h"#include "signal.h"#include "unistd.h"#include "stdio.h"#include "stdlib.h"#include "string.h"struct msgbuf{ long type; char voltage[124]; char ID[4];};int main(){ int msgid; int readret; int key; int pid; struct msgbuf sendbuf,recvbuf; key=ftok("./a.c",'a'); if(key < 0) { printf("creat key failure\n"); return -2; } msgid=msgget(key,IPC_CREAT|0777); if(msgid <0) {printf("creat message queue failure\n");return -1; } printf("creat message queue sucess msgid=%d\n",msgid); system("ipcs -q"); pid=fork(); if(pid > 0) //parent process write 100 { sendbuf.type=100; //write message queue while(1) { memset(sendbuf.voltage,0,124);//clear send buffer printf("please input message:\n"); fgets(sendbuf.voltage,124,stdin); //start write message to message queue msgsnd(msgid,(void *)&sendbuf,strlen(sendbuf.voltage),0); } } if(pid == 0)//child process read 200 {while(1){ memset(recvbuf.voltage,0,124); msgrcv(msgid,(void *)&recvbuf,124,200,0); printf("receive message from message queue:%s",recvbuf.voltage);} } msgctl(msgid,IPC_RMID,NULL); system("ipcs -q"); return 0;}
执行结果:
alex@alex-VirtualBox:~/Share/process/eighteen$ ./servercreat message queue sucess msgid=65537------ Message Queues --------key msqid owner perms used-bytes messages0x00000000 32768 alex 777 0 00x61016518 65537 alex 777 0 0please input message:receive message from message queue:hellohiplease input message:receive message from message queue:who are you...please input message:
Client.c
#include "sys/types.h"#include "sys/msg.h"#include "signal.h"#include "unistd.h"#include "stdio.h"#include "stdlib.h"#include "string.h"struct msgbuf{ long type; char voltage[124]; char ID[4];};int main(){ int msgid; int readret; int key; int pid; struct msgbuf sendbuf,recvbuf; key=ftok("./a.c",'a'); if(key < 0) { printf("creat key failure\n"); return -2; } msgid=msgget(key,IPC_CREAT|0777); if(msgid <0) {printf("creat message queue failure\n");return -1; } printf("creat message queue sucess msgid=%d\n",msgid); system("ipcs -q"); pid=fork(); if(pid == 0) //child process write 200 { sendbuf.type=200; //write message queue while(1) { memset(sendbuf.voltage,0,124);//clear send buffer printf("please input message:\n"); fgets(sendbuf.voltage,124,stdin); //start write message to message queue msgsnd(msgid,(void *)&sendbuf,strlen(sendbuf.voltage),0); } } if(pid > 0)//parent process read 100 {while(1){ memset(recvbuf.voltage,0,124); msgrcv(msgid,(void *)&recvbuf,124,100,0); printf("receive message from message queue:%s",recvbuf.voltage);} } msgctl(msgid,IPC_RMID,NULL); system("ipcs -q"); return 0;}
执行结果:
alex@alex-VirtualBox:~/Share/process/eighteen$ ./clientcreat message queue sucess msgid=65537------ Message Queues --------key msqid owner perms used-bytes messages0x00000000 32768 alex 777 0 00x61016518 65537 alex 777 0 0please input message:helloplease input message:receive message from message queue:hiwho are youplease input message:receive message from message queue:...
0 0
- 18 消息队列3
- 3、SystemV 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 消息队列
- 事务&Hibernate中指定隔离级别
- OpenStack Mitaka 版本不可不知的53个新特性
- Android框架基础之策略设计模式
- 利用软件仿真完整的通信系统
- 什么是多任务?什么叫做进程?什么是线程?
- 18 消息队列3
- 带你一步一步揭开Rxjava2.0的神秘面纱(2)
- 如何获取input type=file的路径
- javaWeb技术开发基础(1)
- Servlet
- (20)Java学习笔记——常用对象API /Object类
- JAVA操作记事本文件时如何解决换行问题
- 再写博文,回顾在Windows7上安装TensorFlow-GPU的一路坑
- JAVA基础