C++实现本地进程通信
来源:互联网 发布:yy摇骰子软件 编辑:程序博客网 时间:2024/06/08 16:03
一般的本地进程通信(即在自己的本机上实现两个不同的进程之间的数据传输)都是通过管道或者命名管道实现,可以通过消息队列或者共享内存的方法解决。
本次主要的内容是通过消息队列实现两个进程之间的数据传输,消息队列是消息传输过程中保存消息的容器,队列的主要目的是提供路由并保证消息的传递,如果发送消息的时候消息的接受者无法接受,队列会暂时存储消息,知道可以接受为止。
当然对于这个概念简单一点的理解可以是两个人在不同的地理位置使用固定电话,当然这个电话是单向接听的,只能一个人听一个人来说,中间的电话线就是消息队列。
接下来的C++实现过程如下(通过命名管道实现,因为命名管道可以创建唯一的IPC ID,从而可以与接受端建立连接):
发送端:
#include <iostream>#include <sys/types.h>// 基本系统数据类型#include <sys/ipc.h>//IPC(命名管道)#include <sys/msg.h>//消息队列#include <stdio.h>#include <stdlib.h>#include <unistd.h>//nix类系统定义符号常量的头文件,包含许多unix系统函数原型:read函数、write函数和getpid函数。#include <string.h>#define BUFFER_SIZE 512struct message{ long msg_type; char msg_text[BUFFER_SIZE];};using namespace std;int main(int argc, const char * argv[]) { // insert code here...// std::cout << "Hello, World!\n"; int qid; key_t key;//获取IPC通讯时的制定ID struct message msg; /*根据不同的路径和关键字产生标准的key key_t ftok( const char * fname, int id ) 指定文件名以及id号 */ if((key = ftok(".", 512)) == -1) { perror("ftok"); exit(1); } /*创建消息队列*/ qid = msgget(key, IPC_CREAT|0666);//通过msgget 得到一个消息队列的ID if(qid == -1)//创建失败 { perror("msgget"); exit(1); } printf("Open queue %d\n", qid); while(1) { printf("input some message to the queue:"); if((fgets(msg.msg_text, BUFFER_SIZE, stdin)) == NULL) { puts("no message"); exit(1); } msg.msg_type = getpid(); /*添加消息到消息队列中*/ if((msgsnd(qid, &msg, strlen(msg.msg_text), 0)) <0) { perror("message posted"); exit(1); } if(strncmp(msg.msg_text, "quit", 4) == 0) { break; } } exit(0);}接受端:
#include <iostream>#include <unistd.h>#include <sys/types.h>#include <sys/msg.h>#include <sys/ipc.h>#include <stdio.h>#include <string.h>#include <stdlib.h>using namespace std;#define BUFFER_SIZE 512struct message{ long msg_tpye; char msg_text[BUFFER_SIZE];};int main(int argc, const char * argv[]) { // insert code here...// std::cout << "Hello, World!\n"; int qid; key_t key; struct message msg; /*根据不同的路径和关键字产生标准的key*/ if((key = ftok(".", 512)) == -1) { perror("ftok"); exit(1); } qid = msgget(key, IPC_CREAT|0666); //获取消息队列的id if(qid < 0) { perror("msgget"); exit(1); } printf("Open queue %d\n", qid); do { memset(msg.msg_text, 0, BUFFER_SIZE);//初始化 if((msgrcv(qid, (void*)&msg, BUFFER_SIZE, 0, 0)) <0) //从进程的消息队列中读取信息 { perror("msgrcv"); exit(1); } printf("The message form process %ld: %s", msg.msg_tpye, msg.msg_text); }while(strncmp(msg.msg_text, "quit", 4));//来比较两个字符串的前n个字符,用msg.msg_text的第一个减去quit,对应字母相减,若差值为0,则继续向下减,否则返回差值 if((msgctl(qid, IPC_RMID, NULL)) <0) { perror("msgctl"); exit(1); } exit(0);}
阅读全文
0 0
- C++实现本地进程通信
- 基于套接字实现本地进程间的通信
- 利用匿名管道技术实现本地进程通信
- Jscript 和本地进程通信
- JScript和本地进程通信
- JScript和本地进程通信
- linux 进程通信——C语言实现
- C#_如何利用SendMessage实现C#进程间通信?
- C语言无名管道实现父子进程间通信
- copy_process.c(采用进程间管道通信方式实现复制)
- C语言两种方法实现进程间 socket 通信
- 多进程并发C/S通信基本模型及实现
- 【C++】使用共享内存实现进程间通信
- Linux C——使用父子进程实现TCP通信
- linux c之通过管道实现兄弟间进程通信:
- linux c之通过管道父子进程实现同步通信
- linux c之用命名管道实现进程通信
- linux c之通过消息队列实现进程通信
- 腾讯前端求职训练营第一天
- 文章标题
- (by王垠)如何掌握所有的程序语言
- 【c#】面向对象简介(构造、析构函数,静态构造函数、静态类)
- haproxy打印日志到rsyslog
- C++实现本地进程通信
- 打开网页就自动打开qq聊天的对话框的办法:使用iframe
- SQL Developer 远程连接 Oracle
- 【c#】接口、继承、多态、接口的多态
- 网络安全之MD5/SHA1
- 文章标题
- 04.24 网络知识章节
- C++每日一课(十七)
- java的int类型线程安全