笔记摘录:进程、作业

第四章   进程

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

   1)一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。

   2)另一个是地址空间,它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。

2、若要使进程完成某项操作,至少得拥有一个线程,该线程负责执行包含在进程的地址空间中的代码。当创建一个进程时,系统会自动创建它的第一个线程,称为主线程。单个进程可能包含若干个线程,每个线程都有一组CPU寄存器和堆栈。若要使所有这些线程都能运行,操作系统在单个CPU计算机上用一种循环方式为各个线程提供时间片。

3、Windows支持两种类型的应用程序:一种是基于图形用户界面(GUI)的应用程序,另一种是基于控制台用户界面(CUI)的应用程序。

   1)基于GUI:有一个图形前端程序。它能创建窗口,拥有菜单,可以通过对话框与用户打交道,并可使用所有的标准Windows组件,如Notepad、Calculator和WordPad。链接程序开关是SUBSYSTEM:WINDOWS。

   2)基于CUI:属于文本操作的应用程序。它不能用于创建窗口或处理消息,并且不需要图形用户界面。它包含在屏幕上的窗口中,但窗口只包含文本。如命令外壳程序CMD.EXE。链接程序开关是SUBSYSTEM:CONDOLE。

4、Windows应用程序必须拥有一个在应用程序启动运行时调用的进入点函数

   WinMain main       (需要ANSI字符和字符串的GUICUI应用程序               嵌入可执行文件的启动函数:WinMainCRTStartup / mainCRTStartup)

   wWinMain wmain  (需要Unicode字符和字符串的GUICUI应用程序          嵌入可执行文件的启动函数:wWinMainCRTStartup / wmainCRTStartup)

   操作系统实际上并不调用你编写的进入点函数,它调用的是C/C++运行期启动函数。该函数负责对C/C++运行期库进行初始化,当所有这些初始化操作完成后,C/C++启动函数就调用应用程序的进入点函数。

5、加载到进程地址空间的每个可执行文件或DLL文件均被赋予一个独一无二的实例句柄。可执行文件的句柄作为(w)WinMain的第一个参数hInstanceExe来传递。hinstExe参数的实际值是系统将可执行文件的映象加载到进程的地址空间时使用的内存基地址。

6、GetModuleHandle函数参数为空时返回主调进程的可执行文件的基地址,参数传入指定的可执行文件或DLL文件名称时返回该文件映像加载到的基地址。

7、线程可以调用GetCurrentDirectory、SetCurrentDirectory函数来获取和设置其所在进程的当前驱动器和目录。

8、CreateProcess被调用时,先创建一个进程内核对象,再为新进程的主线程创建一个线程内核对象,最后主线程执行C/C++运行时的启动例程,调用WinMain、wWinMain、main或wmain函数。

9、CreateProcess函数的第二个参数应传入非常量字符串,在调用CreateProcess函数前应将常量字符串复制到一个临时缓冲区。

10、当进入点函数返回时,启动函数便调用C运行期的exit函数,将返回值(nMainRetVal)传递给它。Exit函数负责下面的操作:

   1)调用由_onexit函数的调用而注册的任何函数。

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

   3)调用操作系统的ExitProcess函数,将返回值传递给它。这使得该操作系统能够撤消进程+并设置它的exit代码。

11、进程终止最推荐方式:从主线程的入口点函数返回,不要显示调用ExitProcess、TerminateProcess函数终止进程。

12、手动提升进程权限,需调用ShellExecuteEx函数,lpVerb参数需被设为“runas”,lpFile参数设置可执行文件的路径。

原文地址:https://www.cnblogs.com/yapp/p/10060026.html