每个进程都有自己私有的句柄表,然而操作系统也有一张句柄表,叫做全局句柄表。这张表包含了所有进程、线程、事件等。
接下简单分析下创建的子进程返回来的 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;
}
```