转载地址:

管道分类:

1. 匿名管道:

只能用于相关进程(如父子进程,兄弟进程),并在他们之间建立内存区域,进程终止后,匿名管道也就消失了。

通常用于:重定向子进程的标准输入输出,以便和父进程交换数据。要双向交换数据必须创建两个匿名管道。不能用于网络环境,也不能用于非关联进程。

2. 命名管道:

是在管道服务器和一台或多台管理客户机之间进行单向或双向通信的一种命名管道。一个管道共享一个管道名,但是每个实例拥有独立的缓存和句柄,并为客户-------服务通信提供一个分离的管道。

命名格式采用UNC格式:\\server\pipe\[path]name

3. 命名管道的实现:

服务端:

1.使用API函数WaitNamedPipe等待一个命名管道实例供自已使用。

2.使用API函数CreateFile建立与命名管道的连接。

3.使用API函数WriteFile和ReadFile分别向服务器发送数据或从中接收数据。

4.使用API函数CloseHandle关闭打开的命名管道会话。

客户端:

1.使用API函数WaitNamedPipe等待一个命名管道实例供自已使用。

2.使用API函数CreateFile建立与命名管道的连接。

3.使用API函数WriteFile和ReadFile分别向服务器发送数据或从中接收数据。

4.使用API函数CloseHandle关闭打开的命名管道会话。

一、匿名管道

点击(此处)折叠或打开

  1. //父进程
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #define CREATE_PIPE_FAILED                1
  5. #define GET_STDOUTPUT_FAILED            2
  6. #define SET_STDOUTPUT_TOPIPE_FAILED    3
  7. #define CREATE_PROCESS_FAILED            4
  8. int main(int argc, char *argv[])
  9. {
  10. HANDLE hRead;
  11. HANDLE hWrite;
  12. STARTUPINFO        si;
  13. PROCESS_INFORMATION pi;
  14. char szReadBuf[100];
  15. DWORD nReadNum;
  16. BOOL bRet;
  17. SECURITY_ATTRIBUTES sa;
  18. sa.bInheritHandle        = TRUE;    //必须为TRUE,父进程的读写句柄可以被子进程继承
  19. sa.lpSecurityDescriptor = NULL;
  20. sa.nLength            = sizeof(SECURITY_ATTRIBUTES);
  21. //创建匿名管道
  22. bRet = CreatePipe( &hRead, &hWrite, &sa, 0);
  23. if ( bRet )
  24. {
  25. printf("成功创建匿名管道!\n");
  26. }
  27. else
  28. {
  29. printf( "创建匿名管道失败!错误码:[%d]\n", GetLastError() );
  30. return CREATE_PIPE_FAILED;
  31. }
  32. //获取本进程标准输出
  33. //GetStdHandle返回INVALID_HANDLE_VALUE表示失败
  34. HANDLE    hTemp    = GetStdHandle( STD_OUTPUT_HANDLE );
  35. if ( INVALID_HANDLE_VALUE == hTemp )
  36. {
  37. printf( "获取本进程标准输出句柄失败!错误码:[%d]\n", GetLastError() );
  38. return GET_STDOUTPUT_FAILED;
  39. }
  40. //设置标准输出到管道
  41. //SetStdHandle设置标准输出到指定设备,返回值非0表示成功,返回0失败
  42. if ( !SetStdHandle( STD_OUTPUT_HANDLE, hWrite) )
  43. {
  44. printf( "设置标准输出到管道失败!错误码:[%d]\n", GetLastError() );
  45. return    SET_STDOUTPUT_TOPIPE_FAILED;
  46. }
  47. //获取STARTUPINFO结构体信息
  48. GetStartupInfo( &si );
  49. //设置STARTUPINFO的标准输出到管道入口,要使标准输入输出有效,必须指定STARTF_USESTDHANDLES
  50. si.dwFlags        = STARTF_USESTDHANDLES;
  51. si.hStdOutput    = hWrite;
  52. si.hStdError    = hWrite;
  53. //创建子进程
  54. bRet = CreateProcess( NULL, "client.exe", NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi);
  55. //恢复标准输出
  56. SetStdHandle( STD_OUTPUT_HANDLE, hTemp );
  57. if ( !bRet )
  58. {
  59. printf( "创建子进程失败!错误码:[%d]\n", GetLastError() );
  60. return CREATE_PROCESS_FAILED;
  61. }
  62. else
  63. {
  64. printf( "成功创建子进程\n" );
  65. }
  66. CloseHandle( hWrite );
  67. //读取管道中的数据
  68. while ( ReadFile( hRead, szReadBuf, 100, &nReadNum, NULL) )
  69. {
  70. szReadBuf[nReadNum] = '\0';
  71. printf( "从管道读取%d个字节数:\n%s", nReadNum, szReadBuf);
  72. }
  73. //ERROR_BROKEN_PIPE错误码标志着子进程被关闭
  74. if ( GetLastError() == ERROR_BROKEN_PIPE)
  75. {
  76. printf( "管道被子进程关闭!\n");
  77. }
  78. else
  79. {
  80. printf( "读取数据错误,错误代码[%d]\n", GetLastError() );
  81. }
  82. //释放创建子进程的资源
  83. CloseHandle( pi.hThread );
  84. CloseHandle( pi.hProcess );
  85. return 0;
  86. }
  87. //子进程
  88. #include <stdio.h>
  89. #include <windows.h>
  90. #include <iostream.h>
  91. void main()
  92. {
  93. for (int i = 0; i < 100; i++)
  94. {
  95. cout<<"---------------"<<endl;
  96. cout<<"标准输出:"<< i <<endl ;
  97. cerr<<"标准错误:"<< i <<endl;
  98. Sleep(100);
  99. cout<<"---------------"<<endl;
  100. }
  101. }

二、命名管道

服务端:

点击(此处)折叠或打开

  1. #include <windows.h>
  2. #include <stdio.h>
  3. /*
  4. **    ==========命名管道客户端写法===========
  5. **    1.使用API函数WaitNamedPipe等待一个命名管
  6. **    道实例供自已使用。
  7. **    2.使用API函数CreateFile建立与命名管道的连
  8. **    接。
  9. **    3.使用API函数WriteFile和ReadFile分别向服
  10. **    务器发送数据或从中接收数据。
  11. **    4.使用API函数CloseHandle关闭打开的命名管
  12. **    道会话。
  13. **    ========================================
  14. */
  15. int main(int argc, char *argv[])
  16. {
  17. HANDLE    hClient;
  18. BOOL bRet;
  19. //WaitNamedPipe等待一个命名管道实例供自己使用
  20. bRet = WaitNamedPipe( "\\\\.\\pipe\\mynamedpipe", NMPWAIT_USE_DEFAULT_WAIT );
  21. if ( bRet == 0 )
  22. {
  23. printf( "wait named pipe failed ! \n");
  24. return 1;
  25. }
  26. //CreateFile与服务端建立连接
  27. hClient = CreateFile("\\\\.\\pipe\\mynamedpipe",GENERIC_READ|GENERIC_WRITE,
  28. 0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  29. if (INVALID_HANDLE_VALUE == hClient)
  30. {
  31. hClient = NULL;
  32. return 2;
  33. }
  34. char szBuf[256];
  35. DWORD nLen;
  36. //从管道读取信息
  37. ReadFile( hClient, szBuf, 256, &nLen, NULL );
  38. szBuf[nLen] = '\0';
  39. printf( "%s", szBuf);
  40. CloseHandle( hClient );
  41. return 0;
  42. }

客户端:

点击(此处)折叠或打开

  1. #include <windows.h>
  2. #include <stdio.h>
  3. /*
  4. **    ==========命名管道客户端写法===========
  5. **    1.使用API函数WaitNamedPipe等待一个命名管
  6. **    道实例供自已使用。
  7. **    2.使用API函数CreateFile建立与命名管道的连
  8. **    接。
  9. **    3.使用API函数WriteFile和ReadFile分别向服
  10. **    务器发送数据或从中接收数据。
  11. **    4.使用API函数CloseHandle关闭打开的命名管
  12. **    道会话。
  13. **    ========================================
  14. */
  15. int main(int argc, char *argv[])
  16. {
  17. HANDLE    hClient;
  18. BOOL bRet;
  19. //WaitNamedPipe等待一个命名管道实例供自己使用
  20. bRet = WaitNamedPipe( "\\\\.\\pipe\\mynamedpipe", NMPWAIT_USE_DEFAULT_WAIT );
  21. if ( bRet == 0 )
  22. {
  23. printf( "wait named pipe failed ! \n");
  24. return 1;
  25. }
  26. //CreateFile与服务端建立连接
  27. hClient = CreateFile("\\\\.\\pipe\\mynamedpipe",GENERIC_READ|GENERIC_WRITE,
  28. 0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  29. if (INVALID_HANDLE_VALUE == hClient)
  30. {
  31. hClient = NULL;
  32. return 2;
  33. }
  34. char szBuf[256];
  35. DWORD nLen;
  36. //从管道读取信息
  37. ReadFile( hClient, szBuf, 256, &nLen, NULL );
  38. szBuf[nLen] = '\0';
  39. printf( "%s", szBuf);
  40. CloseHandle( hClient );
  41. return 0;
  42. }

【VS开发】 Windows平台下管道的使用的更多相关文章

  1. Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE

    Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE Windows平台下安装Arduino IDE Windows操作系统下可以使用安装向导和压缩包形式安装.下面详细讲解这 ...

  2. Windows平台下使用pthreads开发多线程应用

    pthreads简介 POSIX 1003.1-2001标准定义了编写多线程应用程序的API(应用程序编程接口),这个接口通常被称为pthreads.在常见的操作系统中,例如Unix.Linux.Ma ...

  3. Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)

    概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...

  4. windows平台下基于VisualStudio的Clang安装和配置

    LLVM 是一个开源的编译器架构,它已经被成功应用到多个应用领域.Clang是 LLVM 的一个编译器前端,它目前支持 C, C++, Objective-C 以及 Objective-C++ 等编程 ...

  5. Windows平台下搭建Git服务器的图文教程

    Git没有客户端服务器端的概念,但是要共享Git仓库,就需要用到SSH协议(FTP , HTTPS , SFTP等协议也能实现Git共享,此文档不讨论),但是SSH有客户端服务器端,所以在window ...

  6. 在Windows平台下安装与配置Memcached及C#使用方法

    1.在Windows下安装Memcached 资料来源:http://www.jb51.net/article/30334.htm 在Windows平台下安装与配置Memcached的方法,Memca ...

  7. Windows平台下源码分析工具

    最近这段时间在阅读 RTKLIB的源代码,目前是将 pntpos.c文件的部分看完了,准备写一份文档记录下这些代码的用处.处理过程.理论公式来源.注意事项,自己还没有弄明白的地方.目前的想法是把每一个 ...

  8. Windows平台下搭建Git服务器的图文教程(转发)

    Git没有客户端服务器端的概念,但是要共享Git仓库,就需要用到SSH协议(FTP , HTTPS , SFTP等协议也能实现Git共享,此文档不讨论),但是SSH有客户端服务器端,所以在window ...

  9. 【转载】Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)

    概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...

随机推荐

  1. 第六周测试补交 多线程代码和sumN

    1.多线程代码 要求:编译运行多线程程序,提交编译和运行命令截图 2.sumN 要求:1-N求和的截图

  2. 互联网UV,PU,TopN统计

    1. UV.PV.TopN概念 1.1 UV(unique visitor) 即独立访客数 指访问某个站点或点击某个网页的不同IP地址的人数.在同一天内,UV只记录第一次进入网站的具有独立IP的访问者 ...

  3. python 批量打印PDF

    有一批PDF文件,好几百个,每个只打印第2,3页,双面打印. 网上搜索一波,方案如下: 安装Ghostscript,GhostView,使用gsprint命令打印pdf文件. gsprint命令参数说 ...

  4. 使用Apache commons-maths3-3.6.1.jar包,在hive上执行获取最大值的操作

    udf是对hive上的每行(单行)数据操作,现在我要实现对hive上的一列数据操作,udf函数已经满足不了我的要求了,使用udaf对hive的一列求最大值: 代码如下: package com; im ...

  5. linux中>/dev/null 2>&1和2>&1 > /dev/null

    转载:https://www.cnblogs.com/520playboy/p/6275022.html 背景 我们经常能在shell脚本中发现>/dev/null 2>&1这样的 ...

  6. c#中的多态学习总结

    c#的多台方法,大体上和c++的类似,但是有点区别的,我这里刚刚初学,因此把重点记录下. 多态是同一个行为具有多个不同表现形式或形态的能力. 多态性意味着有多重形式.在面向对象编程范式中,多态性往往表 ...

  7. 如何抓取微信小程序的源码?

    一.引言: 在工作中我们会想把别人的代码直接拿过来进行参考,当然这个更多的是前端代码的进行获取. 那么微信小程序的代码怎么样获取呢?  参考 https://blog.csdn.net/qq_4113 ...

  8. learning scala akka actorySystem create and close

    package com.example import akka.actor.ActorSystem import scala.util.{Failure, Success} import scala. ...

  9. NTSTATUS代码摘录

    00000000 STATUS_SUCCESS00000000 STATUS_WAIT_000000001 STATUS_WAIT_100000002 STATUS_WAIT_200000003 ST ...

  10. vue中前端弹窗队列展示

    在前端写一个弹窗可能很简单,那如果同时有多个弹窗呢 这样的话就要考虑弹窗的展示问题,肯定是不能叠加在一起的,这时候就要通过队列(先进先出)来展示 思路就是根据队列来实现,至于具体的实现方式,可以在项目 ...