每个进程都有自己私有的句柄表,然而操作系统也有一张句柄表,叫做全局句柄表。这张表包含了所有进程、线程、事件等。 接下简单分析下创建的子进程返回来的 Process_Information ```c++ typedef struct _PROCESS_INFORMATION { HANDLE hProcess; //本身进程的句柄编号 HANDLE hThread; DWORD dwProcessId; //操作系统全局句柄表的编号 PID DWORD dwThread; //操作系统全局句柄表的编号 TID } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION; //实际上 //hProcess、hThread 是局部的,仅仅针对这个进程有效 //dwProcessId、dwThreadId 是全局的,对整个操作系统都有效,是通过操作系统管理的,不可能出现相同的PID和TID,但唯一不代表不变,如88这个进程,可能下次启动就变量,关闭的进程会被系统回收。 ``` 探讨:PID 是操作系统的全局句柄,ProcessHandle 是进程本身局部的句柄。 打开一个进程,该进程的PID和ProcessHandle 输出,并保持进程运行。 ```c++ bool CreateChildProcess(TCHAR* szChildProcessName, TCHAR* szCommandLine) { SECURITY_ATTRIBUTES sa; STARTUPINFO si; //子进程赋予属性 PROCESS INFORMATION pi; //创建成功后,返回的子线程标识 ZeroMemory(&si, sizeof(si)); ZeroMemory(&pi, sizeof(pi)); if(!CreateProcess( szChildProcessName, //对象名称 szCommandLine, //命令行参数 NULL, //不继承进程句柄 NULL, //不继承线程句柄 FALSE, //不继承句柄 0, //无创建标志 NULL, //使用父进程环境变量 &si, &pi )) { printf("Last error: %d \n", GetLastError()); } //打印子进程相关信息 printf("进程句柄:%d, 线程句柄:%x, 进程ID:%x, 线程ID", p1.hProcess, pi.hThread, pi.dwProcessId, pi.dwThreadId); //释放子进程句柄 CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return TRUE; } int _tmain(int argc, _TCHAR* argv[]) { TCHAR szApplicationName[] = TEXT("c://program files//internet explorer//iexplore.exe"); TCHAR szCommand[] = TEXT("http://www.bing.cn/"); CreateChildProcess(szApplicationName,szCommand); getchar(); return 0; } ```