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);}


原创粉丝点击