当前位置: 首页 > 编程日记 > 正文

8、进程通信-匿名管道

匿名管道

一个单向,未命名的管道,通常用来在一个父进程和一个子进程间传输数据。只能实现本地机器上两个进程间的通信,而不能实现跨网络的通信。

BOOL CreatePipe(

  PHANDLE hReadPipe,                       // read handle

  PHANDLE hWritePipe,                      // write handle

  LPSECURITY_ATTRIBUTES lpPipeAttributes,  // security attributes

  DWORD nSize                              // pipe size

);

CreateProcess 创建进程

创建父进程:

a. CreatePipe:其中第三个参数代表安全属性结构体SECURITY_ATTRIBUTES的指针,在前几章的运用中,都是运用了NULL,代表返回的安全句柄不可以被子进程所继承。但在本运用中,涉及到的是匿名管道。匿名管道就是父子进程之间的通信,所以结构体必须设置相应的值。子进程要想获得匿名管道的读写句柄,只能从父进程继承而来。一旦子进程有了继承而来的读写句柄,就可以和父进程进行通信了。对于机构体SECURITY_ATTRIBUTES,最重要的是第三个参数bInheritHandle,表示Specifies whether the returned handle is inherited when a new process is created. If this member is TRUE, the new process inherits the handle.

b. CreateProcess:如果创建管道成功,则创建子进程,并将管道的读写句柄传递给子进程。

1.MFC单文档程序菜单中增加创建管道,读取数据,写入数据三项

2.View类中增加成员变量

3.  CreateProcess

倒数第三个参数 [in] Pointer to a STARTUPINFO structure that specifies how the main window for the new process should appear 指向STARTUPINFO结构体的一个指针,用来指定新的进程它的主窗口如何出现

最后一个参数指向PROCESS_INFORMATION结构体的一个指针的返回值,用来接收新的进程的标识信息

PROCESS_INFORMATION

The PROCESS_INFORMATION structure is filled in by the CreateProcess function with information

 about a newly created process and its primary thread.

typedef struct _PROCESS_INFORMATION {

    HANDLE hProcess;

    HANDLE hThread;

    DWORD dwProcessId;

    DWORD dwThreadId;

} PROCESS_INFORMATION;

Members

hProcess //新创建进程的句柄

A handle to the newly created process. The handle is used to specify the process in all

 functions that perform operations on the process object.

hThread //新创建进程主线程的句柄

A handle to the primary thread of the newly created process. The handle is used to specify

the thread in all functions that perform operations on the thread object.

dwProcessId //全局进程标识符,如果进程结束操作系统可能会将标识分配给其他进程,我们调用标识的时候要确保进程在运行

A global process identifier that can be used to identify a process. The value is valid from the time the process is created until the time the process is terminated.

dwThreadId //全局线程标识符

A global thread identifiers that can be used to identify a thread. The value is valid from the

time the thread is created until the time the thread is terminated.

创建匿名管道具体代码:

SECURITY_ATTRIBUTES sa;

      //总共就三个参数

      sa.bInheritHandle=TRUE; //表示可被子进程所继承

      sa.lpSecurityDescriptor=NULL; //安全描述符号一般都设置成NULL,即默认描述符

      sa.nLength=sizeof(SECURITY_ATTRIBUTES); //管道长度

      if(!CreatePipe(&hRead,&hWrite,&sa,0))

      {

           MessageBox("创建匿名函数失败!");

           return;

      }

      //管道创建成功后,接着创建子进程,并将读写句柄传递给子进程

      STARTUPINFO sui;

      PROCESS_INFORMATION pi;

      //调用ZeroMemory方法将该结构体中的所有成员都置为0,这是因为这个结构体的成员很多,如果开始的时候没有置为0的话,那它的值是随机的,将这样的结构体传给CreateProcess,可能会影响到执行的结果。

      ZeroMemory(&sui,sizeof(STARTUPINFO));

      sui.cb=sizeof(STARTUPINFO); //设置结构体的大小

      sui.dwFlags=STARTF_USESTDHANDLES; //该标识表示标准输入句柄,标准输出句柄和错误句柄是有用的

      sui.hStdInput=hRead; //将子进程的输入句柄设置成父进程的读句柄

      sui.hStdOutput=hWrite; //将子进程的输出句柄设置成父进程的写句柄

      sui.hStdError=GetStdHandle(STD_ERROR_HANDLE); //得到标准错误句柄,是父进程的错误句柄,该行代码在本程序中没有实际的用途意义

//因为是匿名管道,是没有名称的管道,只有通过CreateProcess由上而下的传递管道操作句柄。

if(!CreateProcess("..\\Child\\Debug\\Child.exe",NULL,NULL,NULL,

           TRUE,0,NULL,NULL,&sui,π))

      {

           MessageBox("创建子进程失败!");

           CloseHandle(hRead);

           CloseHandle(hWrite);

 

           //避免在析构函数中再次关闭,析构函数采用:

           //if(hRead) CloseHandle(hRead)

           hRead=NULL;

           hWrite=NULL;

           return;

      }

      else

      {

           //创建一个新的进程的时候,系统会创建一个进程内核对象和一个线程内核对象,内核对象都有一个使用基数,初始调用的时候,都设置为1。在CreateProcess返回之前,该函数打开进程和线程的内核对象,并将进程相关的句柄放置到结构体PROCESS_INFORMATIONhProcesshThread中,当Process在内部打开这些对象的时候,使得每个对象的使用基数增加到2了。如果在父进程中不需要使用这两个句柄,就将这个句柄进行关闭,使得使用基数减1。当子进程终结的时候,系统会在将使用基数减1,使得子进程的进程内核对象和线程内核对象的使用基数变为0,这样内核对象就可以被释放了。

           CloseHandle(pi.hProcess); //关闭子进程的句柄

           CloseHandle(pi.hThread); //关闭子进程中主线程的句柄

}

          

父进程写匿名管道:

char *buf="hello world";

      DWORD dwWrite;

      if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL))

      {

           MessageBox("匿名管道写入数据失败!");

           return;

}

父进程读匿名管道:

char buf[100];

      DWORD dwRead;

      if(!ReadFile(hRead,buf,100,&dwRead,NULL))

      {

           MessageBox("匿名管道读取数据失败!");

           return;

      }

MessageBox(buf);

     

创建子进程程序:

可以将获取父进程的匿名管道的读写句柄操作放在CView类的OnInitialUpdate方法中实现,该方法是在CView完全构造后调用的第一个方法。代码如下:

hRead=GetStdHandle(STD_INPUT_HANDLE);

hWrite=GetStdHandle(STD_OUTPUT_HANDLE);

子进程的读写匿名管道的代码和父进程的一样,这里不再累述。

    为了让子进程从众多继承的句柄中区分出管道的读、写句柄,就必须将子进程的特殊句柄设置为管道的读写句柄。

参考

1MSDN

2]《VC++ 深入》

3http://blog.csdn.net/liufei_learning/archive/2009/12/17/5026410.aspx 

相关文章:

Enhanced-RCNN: 一种高效的比较句子相似性的方法 |​WWW 2020

作者 | 彭爽出品 | AI科技大本营(ID:rgznai100)国际顶级会议WWW2020将于4月20日至24日举行。始于1994年的WWW会议,主要讨论有关Web的发展,其相关技术的标准化以及这些技术对社会和文化的影响,每年有大批的学者、研究人…

直接可以拿去用的正则验证表达式

直接可以拿去用的正则验证表达式为了方便自己也方便初学的学弟们,自己总结了网上的众多正则验证式,现分享给大家,可以直接拿去用。一、校验数字的1 数字:^[0-9]*$2 n位的数字:^\d{n}$3 至少n位的数字:^\d{n…

家庭局域网开启AP隔离利用无线路由器互连

一开始可以上网,可以ping网关192.168.1.1,但是几台电脑之间就是不能互ping。 其实,真实的原因就是没有开启无线路由器的AP隔离。 在浏览器中输入192.168.1.1进入路由搜索一般用户名密码都是admin,具体请参见自己路由的说明书 操…

通过 Python 代码实现时间序列数据的统计学预测模型

来源 | DeepHub IMBA封图 | CSDN 付费下载于视觉中国 在本篇中,我们将展示使用 Python 统计学模型进行时间序列数据分析。 目标是:根据两年以上的每日广告支出历史数据,提前预测两个月的广告支出金额。原始数据:2017-01-01 到 201…

神色洋溢的 域名背后的故事

前短时间,我刚申请一个域名,好的顶级域名都被被人一拥而上的都强去了,我只好找那些申请好的用户买呀,这叫炒作,就是这样的抄起来的。你说平常一个也就100左右就搞定,可是现在要是到那票手里,那就…

Rust语言开发基础(六)基础语法

2019独角兽企业重金招聘Python工程师标准>>> 一、变量的定义和使用 其它常见的编程语言对变量的定义通常是通过声明类型和使用关键new来创建一个变量,但Rust不是,Rust使用关键字let。 1. 变量绑定通过let实现 fn main() { let x 5; } 2. 变量…

400 多行代码!超详细 Rasa 中文聊天机器人开发指南 | 原力计划

作者 | 无名之辈FTER责编 | 夕颜出品 | 程序人生(ID:coder_life)本文翻译自Rasa官方文档,并融合了自己的理解和项目实战,同时对文档中涉及到的技术点进行了一定程度的扩展,目的是为了更好的理解Rasa工作机制…

Linux配置SSH无密码登陆

可以使用“公钥私钥"认证的方式来进行ssh登录。 所谓 "公钥私钥"认证方式,就是首先在客户机上创建一对公钥和私钥,公钥文件:~/.ssh/id_rsa.pub; 私钥文件:~/.ssh/id_rsa 然后把公钥文件放到目标服务器…

Linux进程浏览器htop安装与使用

htop 是一个 Linux 下的交互式的进程浏览器,可以用来替换Linux下的top命令。当前具有按树状方式来查看进程,支持颜色主题,可以定制等特性。其实htop是top的加强版,增加了很多功能。 官网 http://hisham.hm/htop/ 下载地址http:/…

什么?神经网络还能求解高级数学方程?

来源 | 数据派 THU封图 | CSDN 付费下载于视觉中国 Facebook AI建立了第一个可以使用符号推理解决高级数学方程的AI系统。通过开发一种将复杂数学表达式表示为一种语言的新方法,然后将解决方案视为序列到序列的神经网络的翻译问题,我们构建了一个在解决积…

***和******

网络是一把双刃剑,它在人类社会的发展中起着越来越重要作用,但同时,网络自身的安全问题也像挥之不去的阴影时刻笼罩在人们心头。据不完全统计,全世界平均每 20秒钟就发生一起******事件,互联网上大约有20万个***网站可…

Linux监控工具dstat

dstat是一个用来替换 vmstat,iostat netstat,nfsstat和ifstat这些命令的工具, 是一个全能系统信息统计工具. 与sysstat相比, dstat拥有一个彩色的界面, 在手动观察性能状况时, 数据比较显眼容易观察; 而且dstat支持即时刷新, 譬如输入dstat 3, 即每三秒收集一次, 但最新的数据都…

9月16号晚上,Asuka有一场关于Windows 7组策略的Webcast,欢迎兄弟们来捧场

之所以选题在组策略之一块,是因为Windows 7和2008 R2对于组策略有了很大的功能上的增强,但是很多IT人员都无法意识或者去重视这一块内容,所以我将从下面这3个角度去介绍这些更新。如果您正好有时间,那不妨来技术交流一番:)直播进入…

腾讯天衍实验室联合微众银行研发医疗联邦学习 AI利器让脑卒中预测准确率达80%

近几年,医疗行业正在经历一场数字化转型,这场基于大数据和AI技术的变革几乎改变了整个行业的方方面面,将“信息就是力量”这句箴言体现的淋漓尽致,人们对人工智能寄以厚望,希望它能真正深入临床一线,帮助医…

JavaSript模块化 AMD CMD 详解.....

模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理。模块化是一种处理复杂系统分解为代码结构更合理,可维护性更高的可管理的模块的方式。可以想象一个巨大的系统代码,被整合优化分割…

在Eclipse中使用Maven构建Spring项目

最新版的Spring需要使用Maven构建,本文讲述怎么在Eclipse构建Maven项目,以配置Spring项目为例。 maven简单介绍 maven是构建工具,也是构建管理工具。ant只是构建工具,因为不支持生成站点功能,只有预处理,编…

Go 语言官网全新改版

2019独角兽企业重金招聘Python工程师标准>>> 前两天发现 Go 语言官网改版了,布局由原来的左中右变成了上中下结构,主色调没有变,整体依然保持简洁的风格。在首页添加了一个叫 Playground 的模块,它可以编译、运行你输入…

就在今晚 | 港科大李世玮教授问诊未来,开辟大湾区新航路

阳春三月,万象更新,2020年注定是不平凡的一年!有激荡就会遇见变革,有挑战就会迎来机遇。今天总会过去,未来将会怎样?香港科大商学院内地办事处重磅推出全新升级的《袁老师访谈录》全新系列【问诊未来院长系…

NLP(Natural Language Processing)

https://github.com/kjw0612/awesome-rnn#natural-language-processing 通常有: (1)Object Recognition (2)Visual Tracking (3)Image Generation (4)Video Analysis NLP: (1)Language Modeling (2)Speech Recognition…

Linux环境编程

1.__sync_fetch_and_add和__sync_bool_compare_and_swap gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作。 其声明如下: type __sync_fetch_and_add (type *ptr, type value, ...) type __sync_fetch_and_sub (type *p…

AI新基建如何构建?浪潮给出了一个答案

作者 | Just出品 | AI科技大本营(ID:rgznai100)伴随生产力升级,社会基础设施也正在发生变化。而智慧时代的新型基础设施,要能够对外提供各种算力服务、数据服务和AI服务。浪潮认为,其核心是计算力的生产中心。因此&…

协作是企业管理的重点和难点

这个问题让我想起了一道数学题,11?。在生活中这个题目的答案会千差万别,更别说一个企业。在我眼中,企业中最难管的是关系,更准确的说是协作。 经理过好几个信息系统建设的项目,小到一个简单的邮件系统&…

使用CSS3美化复选框checkbox

我们知道HTML默认的复选框样式十分简陋,而以图片代替复选框的美化方式会给页面表单的处理带来麻烦,那么本文将结合实例带您一起了解一下使用CSS3将复选框checkbox进行样式美化,并且带上超酷的滑动效果。 查看演示 下载源码HTML 通常我们使用以…

Thift安装

thrift官网http://thrift.apache.org/ #wget http://mirror.bit.edu.cn/apache/thrift/0.9.2/thrift-0.9.2.tar.gz #tar -zvxf thrift-0.9.2.tar.gz # ./configure --prefix/usr/local/thrift #make && makeinstall 增加到环境变量 #export PATH$PATH:/usr/…

​“手把手撕LeetCode题目,扒各种算法套路的裤子”

出品 | AI科技大本营(ID:rgznai100)刷LeetCode刷到懵还是一头雾水?莫慌,这里有一个标星27000的算法详解教程。从项目命名来看,作者labuladong就有着要干翻算法的精气神。当然,这个教程不只是为了机械刷题。…

c语言标准库低通的qsort函数不适宜所有排序任务的原因

c语言标准库低通的qsort函数不适宜所有排序任务的原因: 第一:它只能用于内存中的数组排序,不能对链表中的数据排序; 第二:因为它是参数化的函数,所以能对各种数据进行操作,也造成它的运行速度比…

第三周学习进度条

星期日 星期一 星期二 星期三 星期四 星期五 所花时间 下午: 3:00-5:00 上午: 8:00-10:00 下午: 3:00-5:00 下午: 2:30-4:30 下午: 4:30-5:30 下午&#xff1…

jca分析java dump日志

可以使用jca分析java dump的日志 jca:https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid2245aa39-fa5c-4475-b891-14c205f7333c 运维报说是某机房突然全部都线程阻塞了 其中锁住了tcp的socket,在研究无果的情况下…

shell脚本10

对于使用/bin/bash作为登录shell的系统用户,检查他们在/opt目录中拥有的子目录或文件数量,如果超过100个,则列出具体数值及对应的用户帐号.具体实现: #!/bin/bash DIR"/etc" LMT100 validusersgrep "/bin/bash" /etc/passwd|cut -d ":" -f 1 for…

百度重磅发布云手机:低配置也可玩大型游戏 21

又一个科技巨头发力云游戏。4月15日,百度举行"云手机"线上直播会,发布基于自主研发的ARM服务器的百度"云手机"产品,让用户摆脱硬件的制约,中低端设备也能流畅运行大型游戏和应用。百度"云手机"可以…