匿命管道

匿命管道只能使用于有父子关系的两个进程(至少目前为止还没听过使用于无关的两个进程)。

 

当初在学习进程间通讯的都是在Linux下学的,现在学习Win32的进程间通讯遇到一样概念的技术某种程度上的差异,搞得令人很头痛。

 

匿名管道的使用需要以下步骤(MDSN中有步骤一样的实例,只是这里将使用CreateProcess来创建子进程):

 

父进程中

      1.创建匿名管道:

      BOOL CreatePipe(
          PHANDLE hReadPipe,
          PHANDLE hWritePipe,
          LPSECURITY_ATTRIBUTES lpPipeAttributes,
          DWORD nSize
      );

 

     SECURITY_ATTRIBUTES 中的 bInheritHandle 必须为TRUE,才能使可共享的句柄在子进程中被共享。

    

     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
             );

    例:
     STARTUPINFO sui={0};
     PROCESS_INFORMATION pi = {0};

     sui.cb = sizeof(STARTUPINFO);
     sui.dwFlags = STARTF_USESTDHANDLES;
     sui.hStdOutput = hRead;
     sui.hStdInput = hWrite;
     sui.hStdError = GetStdHandle(STD_ERROR_HANDLE);

    

     CreateProcess(L"...",NULL,NULL,NULL,
          TRUE,0,NULL,NULL,&sui,&pi);    // 可以通过博客 Win32API 分类里的CreateProcess了解使用,也可以使用通过查看MSDN;

 

     在这里将子进程的标准输入和标准输出替换成管道的读写句柄。

   

    3、匿管道读写:

    使用ReadFile操作创建管道时获得的读句柄,使用WriteFile操作创建管道时获得的写句柄。

 

 

 

子进程中

  

    1、得到管道的读写句柄:

     HANDLE GetStdHandle(
        DWORD nStdHandle
     );

 

    因为在父进程中创建子进程时,我们将子进程的标准输入输出句柄都替换成了管道的读写句柄。所以需要使用这一函数获得管道的读写句柄。

 

 

    2、匿管道读写:

    使用ReadFile操作创建管道时获得的读句柄,使用WriteFile操作创建管道时获得的写句柄。

 

你可能感兴趣的:(linux,api,Security,null,通讯,attributes)