实现进程间的通信(管道方法)

jiangshi061 2012-08-14 11:46:46
有这样一个场景,我的A程序需要利用另外一个程序,并不是简单的调用,而是与此程序实现交互式的操作,比如cmd.exe。我需要向里面输入命令并且得到结果,怎么办?
这样就涉及到了进程间通信的问题。
我想到利用 CreateProcess 来创建cmd进程, 在这个方法中有一个很复杂的参数,
STARTUPINFO 结构体,用来指定新进程的主窗口特性,这个结构体包括了这个程序所使用的输入和输出的缓存句柄:
HANDLE hStdInput;
HANDLE hStdOutput;
标准输入输出中,hStdInput为键盘缓存的句柄,而hStdOutput为控制台窗口的缓存句柄。
但是我们不是标准输入输出,我们要用自定义的内存来实现,因为这片内存才是我们可控的。管道(Pipe)即是我想要的这段内存。
管道有两个最基本的句柄指针,一个指向读,一个指向写。在写指针进行写操作之后,读指针可以进行读操作。
这样就有了最基本的思路: A程序->cmd.exe_input->执行->cmd.exe_output->A程序
所以需要申明四个变量
m_hWritePipeHandle = NULL;//A程序向管道写
m_hReadPipeShell = NULL;//cmd读取写的内容

m_hWritePipeShell = NULL;//cmd向管道写
m_hReadPipeHandle = NULL; //A程序从管道中读出内容

//建立管道
CreatePipe(&m_hReadPipeHandle, &m_hWritePipeShell, &sa, 0);
CreatePipe(&m_hReadPipeShell, &m_hWritePipeHandle, &sa, 0);

//输入输出绑定
STARTUPINFO si = {0};
si.hStdInput = m_hReadPipeShell;
si.hStdOutput = si.hStdError = m_hWritePipeShell;

//进程建立
CreateProcess(strShellPath, NULL, NULL, NULL, TRUE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);

最后,只需要新建两个线程来分别实现对m_hWritePipeHandle的写,和对m_hReadPipeHandle的读,即可
大功告成!


...全文
230 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-08-21
  • 打赏
  • 举报
回复
共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
·进程之间松耦合
·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
·方便在线开关服务,只需删除或创建该临时文本文件即可。
·方便实现分布式和负载均衡。
·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
·……
翅膀又硬了 2012-08-21
  • 打赏
  • 举报
回复
怎么不写到博客里面去呀,在这说一大堆。
赵4老师 2012-08-14
  • 打赏
  • 举报
回复
C:\MSVC20\SAMPLES\win32\namepipe\*.*
http://download.csdn.net/detail/zhao4zhong1/3253384

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧