Windows管道通信实现进程通信

Windows下用管道通信(pipe)实现进程间数据共享


管道是一种用于在进程间共享数据的机制,其实质是一段共享内存。Windows系统为这段共享的内存设计采用数据流I/0的方式来访问。由一个进程读、另一个进程写,类似于一个管道两端,因此这种进程间的通信方式称作“管道”。
管道分为匿名管道和命名管道。

  1. 匿名管道只能在父子进程间进行通信,不能在网络间通信,而且数据传输是单向的,只能一端写,另一端读。

  2. 命令管道可以在任意进程间通信,通信是双向的,任意一端都可读可写,但是在同一时间只能有一端读、一端写。

创建匿名管道:


1. 定义安全属性结构体:

    SECURITY_ATTRIBUTES sa;
    sa.bInheritHandle = TRUE;//表示可被子进程所继承 
    sa.lpSecurityDescriptor = NULL; //安全描述符号一般都设置成NULL,即默认描述符
    sa.nLength = sizeof(SECURITY_ATTRIBUTES); //管道长度

其中SECURITY_ATTRIBUTES结构体的定义为:

    typedef struct _SECURITY_ATTRIBUTES {
        DWORD nLength;
        LPVOID lpSecurityDescriptor;
        BOOL bInheritHandle;
    } SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;


2. 创建管道:

    BOOL WINAPI CreatePipe(
      PHANDLE hReadPipe,//读取端句柄
      PHANDLE hWritePipe,//输入端句柄
      LPSECURITY_ATTRIBUTES lpPipeAttributes,//安全属性
      DWORD nSize// 管道的缓冲区容量,NULL表示默认大小
    );


3. 读取管道内数据:

    BOOL ReadFile(
      HANDLE hFile,//句柄,可以是标准输入输出流或文件或管道
      LPVOID lpBuffer,  //读取的数据写入缓冲区
      DWORD nNumberOfBytesToRead,//指定读取的字节数
      LPDWORD lpNumberOfBytesRead,//实际读取的字节数
      LPOVERLAPPED lpOverlapped//用于异步操作,一般置为NULL
    );


4. 向管道内写入数据:

    BOOL WriteFile(
      HANDLE hFile,//句柄,同上
      LPCVOID lpBuffer,//指定待写入的数据
      DWORD nNumberOfBytesToWrite,//写入的数据量
      LPDWORDlp NumberOfBytesWritten,//实际要写的数据量
      LPOVERLAPPED lpOverlapped//一般置为NULL
    );


5. 为实现父子进程间的通信,需要对子进程的管道进行重定向:
我们知道创建子进程函数 CreateProcess中有一个参数STARUIINFO,默认情况下子进程的输入输出管道是标准输入输出流,可以通过下面的方法实现管道重定向:

    STARTUPINFO si; 
    si.hStdInput   = hPipeInputRead;   //输入由标准输入 -> 从管道中读取  
    si.hStdOutput  = hPipeOutputWrite; //输出由标准输出 -> 输出到管道 

创建命名管道:

  1. 命名管道有点类似我们常听见的服务器端和客户端,管道正好起着传输正如他的名字,命名管道有自己的名字,首先要指定管道名,管道名遵循的格式为:

    \\.\pipe\pipename。最多可达256个字符的长度,而且不区分大小写
    例如:"\\\\.\\pipe\\Name_pipe_demon_get"
    
  2. 服务器端创建命名管道
        HANDLE WINAPI Crea
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值