进程
一、进程是程序运行的一个实例,程序可以有多个实例(多个进程)
二、获取进程句柄、进程ID
1.获取当前进程句柄
NDLE WINAPI GetCurrentProcess(void);
2.获取进程ID
DWORD WINAPI GetProcessId(
__in HANDLE Process
);
3.获取进程会话ID
BOOL ProcessIdToSessionId(
__in DWORD dwProcessId,
__out DWORD* pSessionId
);
三、进程包含两方面
1.进程内核对象
Ø 一个内核对象,被系统用来管理这个进程,这个内核对象中,还包含了进程的一些策略信息。
2.进程地址空间
Ø 一个地址空间,这个地址空间中包含了可执行代码,动态链接库模块代码,数据,程序动态内存分配获取的内存,也在这个内存地址空间中。
四、进程必须有一个主线程,线程是运行单位,如果进程内所有线程退出,那么进程自动销毁!调用ExitProcess函数,也可以结束进程。
五、我们所编写的windows程序中,真正第一个被执行的函数是:
图像界面的入口函数是:_tWinMain,控制台程序的入口函数是_tmain
WinMainCRTStartup//GUI_ASCII字符类型的C运行时库中的入口函数
wWinMainCRTStartup// GUI_UNICODE字符类型的C运行时库中的入口函数
mainCRTStartup// CUI_ASCII字符类型的C运行时库中的入口函数
wmainCRTStartup// CUI_UNICODE字符类型的C运行时库中的入口函数
C运行时库函数,主要完成以下任务:1. 获取进程命令行指针;
2. 获取进程环境变量指针;
3. 初始化C/C++运行时库的全局变量,如果你包含了头Stdlib.h,那么你就可以访问这些变量!//errno这就是一个全局变量。_enrion这是环境变量指针
4. 初始化malloc函数的内存堆;
5. 为C++全局类,调用构造函数。
Kenerl 调用XXXCRTStartup函数,XXXCRTStartup函数调用main函数;
main函数退出;
exit函数被调用(真正调用的是crt0dat.c中的)
static void __cdecl doexit (
intcode,
intquick,
intretcaller
)
这个函数主要做以下事情:
1. 调用_onexit函数注册的所有函数;
2. 调用C++销毁函数销毁所有的全局和静态类对象;
3. 如果_CRTDBG_LEAK_CHECK_DF标志被设置,那么调用CrtDumpMemoryLeaks函数,列出泄露内存。
4. 调用ExitProcess函数,系统杀死当前进程!