匿名管道

Posted Autumn の Box

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了匿名管道相关的知识,希望对你有一定的参考价值。

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

1、创建匿名管道

  BOOL CreatePipe(

      PHANDLE hReadPipe,                  

      PHANDLE hWritePipe,                     

      LPSECURITY_ATTRIBUTES lpPipeAttributes, 

      DWORD nSize                             

  );

      hReadPipe:作为返回值,返回管道的读取句柄;

      hWritePipe:作为返回值,返回管道的写入句柄;

      lpPipeAttributes:一个指向SECURITY_ATTRIBUTES结构体的指针,检测返回的句柄能否被子进程继承;要在父进程和子进程间建立匿名管道,该参数就不可以设为NULL,子进程需继承父进程的管道句柄,须构造该结构体变量:

        typedef struct _SECURITY_ATTRIBUTES { 

            DWORD  nLength;  //指定该结构体的大小

            LPVOID lpSecurityDescriptor;  //NULL

            BOOL   bInheritHandle;  //TRUE

        } SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;

      nSize:指定管道的缓冲区的大小;如果设为0,系统将使用默认的缓冲区大小;

2、一个进程的创建

  BOOL CreateProcess(

      LPCTSTR lpApplicationName,

      LPTSTR lpCommandLine, 

      LPSECURITY_ATTRIBUTES lpProcessAttributes,

      LPSECURITY_ATTRIBUTES lpThreadAttributes, 

      BOOL bInheritHandles, 

      DWORD dwCreationFlags,

      LPVOID lpEnvironment, 

      LPCTSTR lpCurrentDirectory, 

      LPSTARTUPINFO lpStartupInfo,

      LPPROCESS_INFORMATION lpProcessInformation 

  );

      lpApplicationName:指向一个字符串,用来指定可执行程序的名称,该名称可以是该程序的完整路径和文件名,也可以是部分名称;可以设为NULL,则文件名必须是lpCommandLine指向的字符串中的第一个空格界定的标记;

      lpCommandLine:指向一个字符串,用来传递命令行的参数;通常在调用该函数时,将可执行文件名和命令行参数都传递给lpCommandLine参数;

      lpProcessAttributes:指向SECURITY_ATTRIBUTES结构体的指针,用来设置新进程的进程对象的安全性,及指定将来创建的子进程是否可以继承该进程对象的句柄;可以设为NULL;

      lpThreadAttributes:指向SECURITY_ATTRIBUTES结构体的指针,用来设置新进程的主线程对象的安全性,及指定将来创建的子进程是否可以继承该主线程对象的句柄;可以设为NULL;

      bInheritHandles:该参数用来指定创建的子进程是否能够继承父进程的对象句柄;

      dwCreationFlags:指定控件优先级类和进程创建的附加标记;如果只是为了启动子进程,并不需要设置它创建的标记,可设为0;

      lpEnvironment:一个指向环境块的指针;设为NULL,新进程将使用调用进程的环境;

      lpCurrentDirectory:指定子进程当前的路径,必须是完整的路径名;如果设为NULL,则新进程将与调用进程拥有相同的驱动器和目录;

      lpStartupInfo:一个指向STARTUPINFO结构体的指针,用来指定新进程的主窗口将如何显示;

      lpProcessInformation:作为返回值使用,是一个指向PROCESS_INFORMATION结构体的指针,用来接收关于新进程的标识信息;

        typedef struct _PROCESS_INFORMATION {

            HANDLE hProcess;  //新创建的进程的句柄

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

            DWORD dwProcessId;  //标识一个进程

            DWORD dwThreadId;  //标识一个线程

        } PROCESS_INFORMATION;

 

以上是关于匿名管道的主要内容,如果未能解决你的问题,请参考以下文章

匿名管道

Win32:匿名管道上的事务

Linux匿名管道

匿名管道的 ReadFile 函数

linux中有名管道与匿名管道的实现

匿名管道