参考网址:http://www.xuebuyuan.com/1959215.html

我的测试代码:

Pipe_Server_VC6_Console.exe :

 1 #include <windows.h>
 2
 3 #include <iostream>
 4 using namespace std;
 5
 6 int main()
 7 {
 8     //定义四个句炳保留两个管道的信息
 9     HANDLE hReadPipe1, hWritePipe1, hReadPipe2, hWritePipe2;
10     SECURITY_ATTRIBUTES sat;
11     STARTUPINFO startupinfo;
12     PROCESS_INFORMATION pinfo;
13     BYTE buffer[1024];
14     DWORD byteRead, byteWrite;
15
16     string rString;
17     string m_Host= "Pipe_Client_VC6_Console.exe";
18
19     sat.nLength=sizeof(SECURITY_ATTRIBUTES);
20     sat.bInheritHandle=true;
21     sat.lpSecurityDescriptor=NULL;
22
23     //创建管道,它用来做子进程的输出
24     if(!CreatePipe(&hReadPipe1, &hWritePipe1, &sat, NULL))
25     {
26         cout<<("Create Pipe Error!")<<endl;
27         return 1;
28     }
29
30     //创建管道,它用来做子进程的输入
31     if(!CreatePipe(&hReadPipe2, &hWritePipe2, &sat, NULL))
32     {
33         cout<<"Create Pipe Error!"<<endl;
34         return 1;
35     }
36
37     startupinfo.cb=sizeof(STARTUPINFO);
38     //用GetStartupInfo获得当前进程的参数,否则STARTUPINFO参数太多,会让人抓狂
39     GetStartupInfo(&startupinfo);
40     startupinfo.hStdInput = hReadPipe2;
41     startupinfo.hStdError=hWritePipe1;
42     startupinfo.hStdOutput=hWritePipe1;
43     //要有STARTF_USESTDHANDLES,否则hStdInput, hStdOutput, hStdError无效
44     startupinfo.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
45     startupinfo.wShowWindow=SW_HIDE;
46     if(!CreateProcess(NULL, (char*)m_Host.c_str(), NULL, NULL, TRUE, NULL, NULL, NULL, &startupinfo, &pinfo))
47     {
48         cout<<("create process error!")<<endl;
49         return 1;
50     }
51
52     RtlZeroMemory(buffer,1024);
53     //进程的输出重定向到hWritePipe1,所以从hReadPipe1读取
54     // 在从管道中读取到数据前父进程将发生阻塞
55     if (ReadFile(hReadPipe1,buffer,1023,&byteRead,NULL))
56     {
57         cout<<buffer;
58     }
59
60     string csWrite = "ping www.sina.com.cn\r\n";
61     //进程的输入重定向到hReadPipe2,所以从hWritePipe2写入
62     // 向管道中写数据不会发生阻塞,此循环会一直执行下去。
63     while (WriteFile(hWritePipe2, (LPCVOID)csWrite.c_str(), csWrite.length() + 1, &byteWrite, NULL))
64     {
65         Sleep(1000);
66         cout << "write " << byteWrite << endl;
67     }
68
69
70     CloseHandle(hReadPipe1);
71     CloseHandle(hReadPipe2);
72     CloseHandle(hWritePipe1);
73     CloseHandle(hWritePipe2);
74
75     return 0;
76 }

Pipe_Client_VC6_Console.exe :

 1 #include <windows.h>
 2
 3 #include <iostream>
 4 using namespace std;
 5
 6 int main(int argc, char* argv[])
 7 {
 8     HANDLE hRead = GetStdHandle(STD_INPUT_HANDLE);
 9     HANDLE hWrite = GetStdHandle(STD_OUTPUT_HANDLE);
10
11     char s[] = "Hello, I am child process\n";
12     DWORD dwWrite;
13
14     if (!WriteFile(hWrite, s, strlen(s) + 1, &dwWrite, NULL))
15     {
16         cout << "Write to pipe failed!" << endl;
17         return -1;
18     }
19
20     char buf[100];
21     DWORD dwRead;
22     if(!ReadFile(hRead, buf, 100, &dwRead, NULL))
23     {
24         cout << "Read from pipe failed!" << endl;
25         return -1;
26     }
27
28     return 0;
29 }

C

转载于:https://www.cnblogs.com/CodeSkill/p/4951888.html

管道 通过匿名管道在进程间双向通信相关推荐

  1. 通过单管道(pipe)实现两个进程间双向通信

    用例: #include <stdio.h> #include <unistd.h>#define BUF_SIZE 30int main(int argc, char con ...

  2. 有名管道FIFO,进行双进程的“双向通信”

    更多资料请点击:我的目录 本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢. 本篇记录应用有名管道FIFO,进行双进程的"双向通信" ...

  3. 【Linux】进程间通信--管道(匿名管道和命名管道)

    文章目录 前言 进程间通信的目的 管道 匿名管道 管道特点 站在文件描述符角度理解管道 匿名管道通信读写特点 命名管道 命名管道的原理 命名管道的创建 命名管道完成两个不同进程通信 匿名管道和命名管道 ...

  4. C++学习:第六章Linux高级编程 - (七)信号、sigqueue、sigaction、IPC、管道、匿名管道

    回顾: 1. 信号的作用 2. 理解信号: 软中断 可靠与不可靠信号 kill -l 3. 信号发送与注册 kill/raise alarm setitimer signal 4. 信号的屏蔽 sig ...

  5. Linux-C语言-利用有名管道简单实现两个进程间的全双工通信

    有名管道特点: 1.有名管道是对无名管道的改进,它可以使互不相关的两个进程互相通信,并且在文件系统中可见,可以通过文件名来找到. 2.半双工的通信方式,进程通过文件IO来操作有名管道. 3.有名管道遵 ...

  6. #Linux#进程间通信# 管道(pipe)-匿名管道pipe

    我们通常把一个进程连接到另一个进程的一个数据流称为一个"管道",通常是用作把一个进程的输出通过管道连接到另一个进程的输入.管道本质上是内核的一块缓存.内核使用环形队列机制,借助内核 ...

  7. php+管道+pipe管道,C++ 匿名管道执行DOS命令

    最近在开发一个项目.需要PHP Sock连接到服务器中执行DOS 命令 , 所以想到了命名管道 CreatePipe 其函数原型BOOL CreatePipe( PHANDLE hReadPipe, ...

  8. 进程间通信之管道(匿名管道与命名管道)

    进程间通信之管道 进程间通信 管道 什么是管道 管道分类--1.匿名管道 匿名管道举例 管道的特点 管道分类--2.命名管道 创建一个命名管道 举例 命名管道的打开规则 匿名管道与命名管道的区别 具体 ...

  9. 关于Qt的QProcess进程间双向通信

    文章目录 前言 一.QProceess简介 二.实例 1.进程A(主进程) 2.进程B 3.运行 总结 前言 Qprocess作为Qt的进程通信类,在程序中的应用还是挺多的,不管是启动一个命令行,还是 ...

最新文章

  1. VMWare虚拟机网络连接
  2. 怎么添加新项目到svn服务器,用eclipse+svn插件,上传新项目到svn服务器
  3. IDEA Reference - Essentials(基本要义)
  4. php 7.1安装教程
  5. 【动态规划】[Uva11270]Tiling Dominoes
  6. 基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级
  7. GIL , 线程池 , 同步 , 异步 , 队列 , 事件
  8. Kafka Producer源码简述
  9. springcloud -zuul(2-执行流程及源码)
  10. 边缘计算应用场景_从6大应用场景,看边缘计算落地生根
  11. CABAC基于上下文的自适应二进制熵编码
  12. Atitit 近年来的软件与编程与技术趋势大盘点 and 2017 未来技术趋势attilax总结
  13. 新版Cadence打开PSpice8.0工程文件
  14. 数字图像处理课后习题汇总
  15. 【C++】单例模式代码实现
  16. gh-ost 参数解析,看这一篇就够了!
  17. 输出一个由*组成的三角形图案_Python中实现个性图案的方案
  18. lammps及Reaxff反应力场二合一专题内容都在这
  19. 风险投资VC对ESG指标的影响
  20. [Power Query] 删除重复项

热门文章

  1. CRC 冗余校验计算
  2. android中shape的属性
  3. CListCtrl,SetItemState 高亮(显示蓝色)
  4. 旋转矩阵与欧拉角的相互转换及代码
  5. mysql存储过程更新数据后返回一个字段_史上最全存储引擎、索引使用及SQL优化的实践...
  6. mysql 表变量_在MySQL中创建表变量
  7. html textarea粘贴事件,javascript在textarea中捕获粘贴事件
  8. 容灾服务器作用,存储容灾服务
  9. 现在企业编程用java还是python_想转行做程序员,是学习 Java 还是 Python 更好?
  10. 浏览器 刷新页面后回到顶部_当你在浏览器中,忘记了曾经的登录密码怎么办......