第四章 进程(1)

 

进程

A:进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:

OS用来管理进程的内核对象(内核对象也是系统用来存放关于进程的统计信息的地方)

•地址空间 (它包含所有可执行模块或 DLL模块的代码和数据,它还包含动态内存分配的空间)

当创建一个进程时,系统会自动创建它的第一个线程,称为主线程。然后,该线程可以创建其他的线程。

B: Windows支持两种类型的应用程序

基于图形用户界面( GUI)的应用程序; 它能创建窗口,拥有菜单,可以通过对话框与用户打交道,并可使用所有的标准“Windows”组件。

基于控制台用户界面(C U I)的应用程序; 通常不能用于创建窗口或处理消息,并且它们不需要图形用户界面。命令外壳程序CMD.EXE是典型的基于C U I的应用程序。

C: Windows应用程序必须拥有一个在应用程序启动运行时调用的进入点函数。可以使用的进

入点函数有4个:

int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE ,

PSTR pszCmdLine, int nCmdShow );

int WINAPI wWinMain(HINSTANCE hinstExe, HINSTANCE ,

PWSTR pszCmdLine, int nCmdShow );

int _ _ cdecl main(int argc, char *argv[], char *envp[]);

int _ _ cdecl wmain(int argc, wchar *argv[], wchar *envp[]);

 

应用程序类型 嵌入可执行文件的启动函数

ANSI字符和字符串的GUI应用程序 WinMain WinMainCRTStartup

Unicode字符和字符串的GUI应用程序 wWinMain wWinMainCRTStartup

ANSI字符和字符串的CUI应用程序 main mainCRTStartup

Unicode字符和字符串的CUI应用程序 wmain wmainCRTStartup

 

操作系统实际上并不调用你编写的进入点函数。它调用的是 C/C++运行期启动函数。该函数负责对C/C++运行期库进行初始化,这样,就可以调用mallocfree之类的函数它还能够确保已经声明的任何全局对象和静态C + +对象能够在代码执行以前正确地创建。

D: 链接程序负责在它连接可执行文件时选择相应的 C / C + +运行期启动函数。

如果设定了/SUBSYSTEM:WINDOWS该链接程序查找WinMainwWinMain函数。如果这两个函数都不存在,链接程序便返回一个“未转换的外部符号”的错误消息。否则,它选择WinMainCRTStartup函数或wWinMainCRTStartup函数。

如果设定了/SUBSYSTEM : CONSOLE该链接程序查找mainwmain函数,并选择 mainCRTStartup函数或wmainCRTStartup函数。同样,如果mainwmain都不存在,那么链接程序返回一条“未转换外部符号”的消息。

如果从应用程序中全部删除 /SUBSYSTEM链接程序开关。链接程序能够自动确定应用程序应该连接到哪个子系统。当进行链接时,链接程序要查看代码中存在4个函数(WinMainwWinMain,main,wmain)中的哪一个。然后确定可执行程序应该是哪一个子系统,并且确定可执行程序中应该嵌入哪个 C/C++启动函数。

E: 启动函数的功能如下:

检索指向新进程的完整命令行的指针。

检索指向新进程的环境变量的指针。

C/C++运行期的全局变量进行初始化。若包含了StdLib.h文件,代码就能访问些变量。

C运行期内存单元分配函数(malloccalloc)和其他低层输入/输出例程使用的内存栈进行初始化。

为所有全局和静态C + +类对象调用构造函数。

F: 当所有这些初始化操作完成后,C/C++启动函数就调用应用程序的进入点函数。当进入点函数返回时,启动函数便调用C运行期的e x i t函数,将返回值(n M a i n R e t Va l)传给它。 E x i t函数负责下面的操作:

调用由_ o n e x i t函数的调用而注册的任何函数。

为所有全局的和静态的C + +类对象调用析构函数。

调用操作系统的ExitProcess函数,将nMainRetVal传递给它。这使得该操作系统能够撤消进程并设置它的e x i t代码。

原文地址:https://www.cnblogs.com/dyufei/p/2574011.html