一、管道的根本

  • 管道是在内存中申请的一块缓冲区,因为不同的进程只能读取自己限定范围的数据,所以使用这块缓冲区用于进程之间的通信;
  • 匿名管道用于进程之间通信,且仅限于本地父子进程之间通信,结构简单,类似于一根非水平状态的水管,一端进水另一端出水(单工通信)。相对于命名管道,其占用小实现简单。

二、匿名管道的使用

匿名管道主要用于本地父进程和子进程之间的通信,在父进程中的话,首先是要创建一个匿名管道,在创建匿名管道成功后,可以获取到对这个匿名管道的读写句柄,然后父进程就可以向这个匿名管道中写入数据和读取数据了,但是如果要实现的是父子进程通信的话,那么还必须在父进程中创建一个子进程,同时,这个子进程必须能够继承和使用父进程的一些公开的句柄;
同时在创建子进程的时候,必须将子进程的标准输入句柄设置为父进程中创建匿名管道时得到的读管道句柄,将子进程的标准输出句柄设置为父进程中创建匿名管道时得到的写管道句柄;

三、代码详解

Windows中有创建管道的API:

BOOL CreatePipe{ PHANDLE hReadPipe, // 指向读端句柄的指针PHANDLE hWritePipe, // 指向写端句柄的指针LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向安全属性结构的指针DWORD nSize // 管道的容量
}

其中nSize一般指定为0,以便让系统自己决定管道的容量。现在来看第三项安全属性结构——SECURITY_ATTRIBUTES

typedef struct _SECURITY_ATTRIBUTES { //SADWORD nLength;//结构体大小LPVOID lpSecurityDescriptor;//安全描述符BOOL bInheritHandle;//安全描述对象能否被继承
} SECURITY_ATTRIBUTES;

如下所示就创建了一个管道

HANDLE hReadPipe, hWritePipe;
SECURITY_ATTRIBUTES sa;
//给sa赋值
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL; file://使用系统默认的安全描述符
sa.bInheritHandle = TRUE; file://一定要为TRUE,不然句柄不能被继承。
CreeatePipe(&hReadPipe,&hWritePipe,&sa,0);

四、匿名管道程序实例

#include <windows.h>
#include <iostream>
using namespace std;
int main(){PROCESS_INFORMATION pi;HANDLE hRead;//管道读句柄handle hWrite;//管道写句柄BOOL bCSuc=CreatePipe(&hRead,&hWrite,NULL,0);//创建匿名管道if(bCSuc)cout<<"创建匿名管道成功."<<endl;elsecout<<"创建匿名管道成功."<<GetLastError();//出错原因//记录主进程的标准输出HANDLE hTemp=GetStdHandle(STD_OUTPUT_HANDLE);//然后将输出写入匿名管道SetStdHandle(STD_OUTPUT_HANDLE,&hWrite);//获取主进程的STARTUPINFO结构信息STARTUPINFO si;GetStartInfo(&si);//并写入si//创建子进程BOOL bCSuc=CreateProcess(NULL,(LPSTR)"\"C:\\Users\\lenovo\\Desktop\\NMpiple\\Debug\\inp.exe\" -L -S",NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi);SetStdHandle(STD_OUTPUT_HANDLE, hTemp); //恢复本进程的标准输出if(bCus)cout<<"开始子进程成功"<<endl;elsecout<<"开始子进程失败"<<GetLastError()<<endl;CloseHandle(hWrite);//关闭这个进程写句柄while(ReadFile(hRead,ReadBuf,100,&ReadNum,NULL)){ReadBuf[ReadNum]='\0';cout<<"从管道读取"<<ReadNum<<"子节数据"<<endl;cout<<ReadBuf<<endl;}if (GetLastError() == ERROR_BROKEN_PIPE) // 输出信息printf("管道已经被子进程关闭\n");elseprintf("读数据错误,错误代码:%d\n", GetLastError());system("pause");return 0;
}

在本示例中,将当前进程的标准输出设置为使用匿名管道,再创建子进程,子进程将继承父进程的标准输出,然后再将父进程的标准输出恢复为其初始状态。于是父进程便可从管道读取数据,直到有错误发生或关闭管道写入端的所有句柄。创建的子进程只是向标准输出和标准错误发送一些文本信息,其中发送给标准输出的文本将重定向输出到管道,发送给标准错误的文本将不改变输出。
下面给出子进程的实现代码:

#include <iostream>
using namespace std;
int main(){for(int i=0;i<200;++i){cout<<"标准输出:"<<i<<endl;cerr<<"标准错误:"<<i<<endl;//cerr}return 0;
}

C++windows环境管道通信相关推荐

  1. Windows/Linux平台下命名管道通信调用参考

    在一些需要传递少量数据的进程通信业务中,采用命名管道通信是一种不错的选择,但是管道通信本身是不跨平台的.如果我们想在不同的平台下使用管道通信就会很麻烦.这里我简单的总结了一下命名管道在windows平 ...

  2. 如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信

    http://blog.csdn.net/whuancai/article/details/11994341 如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通 ...

  3. Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)

    Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)(畅销10年,经典再现!) 罗云彬 著 ISBN 978-7-121-20759-4 2013年7月出版 定价:99.00元 75 ...

  4. c语言管道通信实例,C语言辅导:VC命名管道通信的实现

    无论是SQL Server的用户,还是PB的用户,作为C/S结构开发环境,他们在网络通信的实现上,都有一种共同的方法--命名管道.由于当前操作系统的不惟一性,各个系统都有其独自的通信协议,导致了不同系 ...

  5. 《Windows网络与通信程序设计(第3版)》——1.4 网络应用程序设计基础

    本节书摘来自异步社区<Windows网络与通信程序设计(第3版)>一书中的第1章,第1.4节,作者: 陈香凝 , 王烨阳 , 陈婷婷 , 张铮 更多章节内容可以访问云栖社区"异步 ...

  6. php-cgi和php-fpm,Windows环境下解决Nginx+php并发访问阻塞问题。

    php-cgi 是运行php, php-fpm是守护php-cgi进程 nginx配置目录运行php         location  ~ \.php$         {              ...

  7. 在Windows环境下搭建Android开发环境

    标题:在Windows环境下搭建 Android 开发环境 作者:CrazyPebble 时间:2011年2月28日 声明:此文在参考其他网上资料以及笔者实践总结写下,一来自己可以做一些总结,二来给跟 ...

  8. java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...

    进程间的通信方式有很多种, 上次我们说了最傻瓜的"共享外存/文件"的方法. 那么, 在本文中, 我们即将学习"共享内存"的方式实现进程间的通信, 这是IPC最快 ...

  9. php管道邮件,php进程通信-PIPE管道通信

    上一篇文章讲到了php进程通信的进程信号通信方法,本文介绍的是有名管道: 管道通信,主要是利用文件,写入以及读取来进行通信的, 通俗来讲,就是A进程在1.txt写入1,B进程读取1.txt,就能读取到 ...

  10. windows环境下C语言socket编程

    最近由于实验需要,要求写一个c程序与java程序通信的软件,为了测试首先写了一个windows环境下c语言的socket(tcp)通信程序. 首先socket通信的步骤:    图一     sock ...

最新文章

  1. java中标识符,关键字,数据类型
  2. python语言及其应用下载_Python语言及其应用 中文pdf完整版[13MB]
  3. 理解php反序列化漏洞
  4. 安装解压版本的MySQL,安装过程中的常见命令,检查windows系统错误日志的方式来检查MySQL启动错误,关于Fatal error: Can't open and lock privilege
  5. 跟Kafka学技术-缓冲池的使用
  6. windows下面怎么github ssh 公钥,然后克隆项目
  7. 交换两个整型变量的数值
  8. 【Clickhouse】CLICKHOUSE SQL文件等常用语句
  9. webAppbuilder微件使用教程1 快速入门
  10. silverlight小结
  11. 使用libhybris库linux调用android库
  12. Ubuntu18.04配置视觉SLAM十四讲代码运行环境
  13. zbursh2021尝新,安装包
  14. 电磁场与仿真软件(24)
  15. 史上最全视觉SLAM资料及研究方向思路汇总
  16. linux 查看服务器资源(cpu型号、cpu数量、内存大小、磁盘空间)
  17. 风口上的线上盲盒小程序
  18. 基于eNSP的模拟企业网络的架构
  19. 九联UNT413A_S905L3A__AI语音_默认打开ADB_完美线刷固件包【可救砖】
  20. 【Alpha版本】冲刺阶段——Day 5

热门文章

  1. 【CGAL_空间搜索与排序】3D快速求交和距离计算
  2. 网页占满整个屏幕_网页打开后占满了全部电脑屏幕怎么办
  3. php 公众号群发消息,PHP 微信公众号 群发文本消息
  4. FPGA之旅设计99例之第十九例----OV5640上电及初始化
  5. Detours库使用与原理分析
  6. 基于C/C++的PCM编码与解码简单实现
  7. 用计算机算e的平方为什么显示错误,计算器中出现的E是什么意思?
  8. 宁波注塑电子塑料件加工
  9. poi excel 添加水印
  10. Google Earth影像数据破解之旅