Windows C++ 使用PIPE命名管道实现进程间通讯

简介: 本文章是介绍在Windows下,使用PIPE管道实现进程间通讯,可是实现两个进程之前相互发送读取消息。

本文章是介绍在Windows下,使用PIPE管道实现进程间通讯,可是实现两个进程之前相互发送读取消息。


主进程代码

#include "windows.h"#include <iostream>usingnamespacestd;
#define BUF_SIZE 4096// 定义管道名 , 如果是跨网络通信 , 则在圆点处指定服务器端程序所在的主机名#define EXAMP_PIPE   L"\\\\.\\PIPE\\EB3F2E4B_52E2_40F9_A17D_B4A2588F23AB"   intmain(intargc, TCHAR*argv[], TCHAR*envp[])
{
// 创建命名管道HANDLEhPipe=NULL;
hPipe=CreateNamedPipe(
EXAMP_PIPE,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
BUF_SIZE,
BUF_SIZE,
0,
NULL);
if (hPipe==INVALID_HANDLE_VALUE)
    {
cout<<"Create Read Pipe Error"<<endl;
returnFALSE;
    }
cout<<"Wait for the connection"<<endl;
// 等待客户端的连接if (!ConnectNamedPipe(hPipe, NULL))
    {
cout<<"Connect Failed"<<endl;
returnFALSE;
    }
DWORDdwReturn=0;
charszBuffer[BUF_SIZE] = { 0 };
// 向客户端发送数据cout<<"Wait for input"<<endl;
cin>>szBuffer;
if (!WriteFile(hPipe, szBuffer, strlen(szBuffer), &dwReturn, NULL))
    {
cout<<"Write Failed"<<endl;
    }
// 读取客户端数据memset(szBuffer, 0, BUF_SIZE);
if (ReadFile(hPipe, szBuffer, BUF_SIZE, &dwReturn, NULL))
    {
szBuffer[dwReturn] ='\0';
cout<<szBuffer<<endl;
    }
else    {
cout<<"Read Failed"<<endl;
    }
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);
return0;
}



子进程代码

#include "windows.h"#include <iostream>usingnamespacestd;
#define BUF_SIZE 4096// 定义管道名 , 如果是跨网络通信 , 则在圆点处指定服务器端程序所在的主机名#define EXAMP_PIPE   L"\\\\.\\PIPE\\EB3F2E4B_52E2_40F9_A17D_B4A2588F23AB"intmain(intargc, TCHAR*argv[], TCHAR*envp[])
{
HANDLEhPipe=NULL;
charszBuffer[BUF_SIZE] = { 0 };
DWORDdwReturn=0;
// 判断是否有可以利用的命名管道  if (!WaitNamedPipe(EXAMP_PIPE, NMPWAIT_USE_DEFAULT_WAIT))
    {
cout<<"No Read Pipe Accessible"<<endl;
return0;
    }
// 打开可用的命名管道 , 并与服务器端进程进行通信  hPipe=CreateFile(EXAMP_PIPE, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
if (hPipe==INVALID_HANDLE_VALUE)
    {
cout<<"Open Read Pipe Error"<<endl;
return0;
    }
cout<<"Wait for the message"<<endl;
// 读取服务端发来的数据if (ReadFile(hPipe, szBuffer, BUF_SIZE, &dwReturn, NULL))
    {
szBuffer[dwReturn] ='\0';
cout<<szBuffer<<endl;
    }
else    {
cout<<"Read Failed"<<endl;
    }
// 向服务端发送数据memset(szBuffer, 0, BUF_SIZE);
cin>>szBuffer;
if (!WriteFile(hPipe, szBuffer, strlen(szBuffer), &dwReturn, NULL))
    {
cout<<"Write Failed"<<endl;
    }
CloseHandle(hPipe);
return0;
}

80后程序员

相关文章
|
2天前
|
人工智能 机器人 C++
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
|
2天前
|
人工智能 机器人 编译器
【C++】Windows端VS code中运行CMake工程(手把手教学)
【C++】Windows端VS code中运行CMake工程(手把手教学)
|
2天前
|
关系型数据库 数据库 C++
【C++】Windows使用Visual Studio C++链接云数据库PostgreSQL(沉浸式老爷教学)
【C++】Windows使用Visual Studio C++链接云数据库PostgreSQL(沉浸式老爷教学)
|
2天前
|
Linux
【Linux】命名管道的创建方法&&基于命名管道的两个进程通信的实现
【Linux】命名管道的创建方法&&基于命名管道的两个进程通信的实现
|
2天前
|
Linux
【Linux】匿名管道实现简单进程池
【Linux】匿名管道实现简单进程池
|
2天前
|
Linux
【Linux】进程通信之匿名管道通信
【Linux】进程通信之匿名管道通信
|
2天前
利用命名管道实现任意进程间的通信
利用命名管道实现任意进程间的通信
|
2天前
|
算法 Linux 调度
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
13 1
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
|
2天前
|
Linux 调度 数据库
|
2天前
|
存储 缓存 Linux
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互
本文介绍了Xenomai中的XDDP(Xenomai Distributed Data Protocol)通信机制,XDDP用于实时和非实时进程之间的数据交换。XDDP在Xenomai内核中涉及的数据结构和管理方式,以及创建XDDP通道后的实时端和非实时端连接过程。
22 0
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互