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后程序员

相关文章
|
1月前
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
129 14
|
1月前
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
128 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
3月前
|
存储 Unix Linux
进程间通信方式-----管道通信
【10月更文挑战第29天】管道通信是一种重要的进程间通信机制,它为进程间的数据传输和同步提供了一种简单有效的方法。通过合理地使用管道通信,可以实现不同进程之间的协作,提高系统的整体性能和效率。
|
4月前
|
Java 关系型数据库 MySQL
java控制Windows进程,服务管理器项目
本文介绍了如何使用Java的`Runtime`和`Process`类来控制Windows进程,包括执行命令、读取进程输出和错误流以及等待进程完成,并提供了一个简单的服务管理器项目示例。
68 1
|
4月前
|
iOS开发 MacOS
MacOS环境-手写操作系统-40-进程消息通讯 和 回车键处理
MacOS环境-手写操作系统-40-进程消息通讯 和 回车键处理
42 2
|
5月前
|
消息中间件 Unix Linux
C语言 多进程编程(二)管道
本文详细介绍了Linux下的进程间通信(IPC),重点讨论了管道通信机制。首先,文章概述了进程间通信的基本概念及重要性,并列举了几种常见的IPC方式。接着深入探讨了管道通信,包括无名管道(匿名管道)和有名管道(命名管道)。无名管道主要用于父子进程间的单向通信,有名管道则可用于任意进程间的通信。文中提供了丰富的示例代码,展示了如何使用`pipe()`和`mkfifo()`函数创建管道,并通过实例演示了如何利用管道进行进程间的消息传递。此外,还分析了管道的特点、优缺点以及如何通过`errno`判断管道是否存在,帮助读者更好地理解和应用管道通信技术。
|
5月前
|
SQL 网络协议 数据库连接
已解决:连接SqlServer出现 provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程【C#连接SqlServer踩坑记录】
本文介绍了解决连接SqlServer时出现“provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程”错误的步骤,包括更改服务器验证模式、修改sa用户设置、启用TCP/IP协议,以及检查数据库连接语句中的实例名是否正确。此外,还解释了实例名mssqlserver和sqlserver之间的区别,包括它们在默认设置、功能和用途上的差异。
|
6月前
|
消息中间件 Linux 开发者
Linux进程间通信秘籍:管道、消息队列、信号量,一文让你彻底解锁!
【8月更文挑战第25天】本文概述了Linux系统中常用的五种进程间通信(IPC)模式:管道、消息队列、信号量、共享内存与套接字。通过示例代码展示了每种模式的应用场景。了解这些IPC机制及其特点有助于开发者根据具体需求选择合适的通信方式,促进多进程间的高效协作。
252 3
|
6月前
|
Java Windows
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
|
6月前
|
Windows
Windows中如何查看被占用的端口、杀掉对应的进程
这篇文章介绍了在Windows系统中如何查看被占用的端口号以及如何杀掉占用端口的进程,包括使用命令提示符的`netstat -ano | findstr 端口号`命令查找进程PID,然后通过任务管理器或`taskkill /PID PID号`命令来结束进程。
Windows中如何查看被占用的端口、杀掉对应的进程