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