首页 > 代码库 > 匿名管道
匿名管道
匿名管道是一个未命名的、单向管道,通常用来在一个父进程和一个子进程之间传输数据;匿名管道只能实现本地机器上两个进程间的通信,而不能实现跨网络的通信;
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;
匿名管道