1. 程式人生 > >匿名管道

匿名管道

能夠 傳輸數據 des 窗口 cat startup 進程創建 read inf

匿名管道是一個未命名的、單向管道,通常用來在一個父進程和一個子進程之間傳輸數據;匿名管道只能實現本地機器上兩個進程間的通信,而不能實現跨網絡的通信;

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;

匿名管道