WINDOWS核心编程之进程(一)

从今天开始说说进程
 
进程通常被定义为一人正在运行的程序的实例,它由两个部分组成:
1.       一个是操作系统用来管理进程的内核对象,内核对象也是系统用来存放关于进程的统计信息的地方。
2.       另一个是地址空间,它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。
 
要使进程完成某项操作,它必须要有一个自已的线程,来执行包含在此进程的地址空间中的代码。每个线程都有它自已的一组CPU寄存器和它自已的堆栈。
 
多个线程是如何运行的呢,操作系统为每个线程安排一定的CPU,通过一种循环方式为线程式提供时间片(称为量称)
 
Windows支持两种类型的应用程序。一种是基于图形用户界面(GUI)的应用程序,另一种是基于控制台用户界面(CUI)的应用程序。
 
在vc设置里的链接程序根据 /SUBSYSTEM:CONDOLE还是/SUBSYSTEM:WINDOWS,当用户运行一个应用程序时,os的加载程序查看可执行图形程序的标题,并抓取该子系统的值,如果该值指明一个CUI应用程序,那么加载程序就会自动保证为该应用程序创建文本控制台窗口。反之加载应用程序,当应用程序启动运行后,os就不再关心应用程序拥有什么类型的用户界面了。
 
Windows提供的四个应用程序启动运行时调用的进入点函数
Int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PSTR pszCmdLine, int nCmdShow);
//第二个参数表示前一个实例句柄,它是用在16位windows上的
Int WINAPI wWinMain(HINSTANCE hinstExe, HINSTANCE, PWSTR nszCmdLine, int nCmdShow);l
 
Int _cdecl main(int argc, char *agrv[], char *envp[]);
 
Int _cdecl wmain(int argc, wchar_t *argv[], wchar_t *envp[]);
 
注意:os并不调用我们编写的进入点函数,它是调用的是c/c++运行期启动函数。该 函数负责对c/c++运行期库进行初始化, 这样,就可以调用malloc和free之类的函数。它还能确保已经声名的任何全局对象和静态c++对象能够在代码执行之前正确的创建
 
应用程序的进入点
 应用程序类型                                                     进入点                   嵌入可执行文件的启动函数
需要ASCI字符和字符串的GUI应用程序          WinMain                 WinMainCRTStartup
需要UNICODE字符和字符串的GUI应用程序  wWinMain              wWinMainCRTStartup
需要ASCI字符和字符串的CUI应用程序          main                         mainCRTStartup
需要UNICODE字符和字符串的CUI应用程序 wmain                      wmainCRTStartup
 
所有的c/c++运行期启动函数的作用都是相同的,只不过处理ANSI字符串还是Unicode字符串,以及它们在对C运行期库进行初始化后它们调用哪个进入点函数。
 
C运行期库的源代码在CRt0.c文件里
其主要功能如下:
1.       检索指向新进程的完整命令行的指针.
2.       检索指向新进程的环境变量的指针。
3.       对c/c++运行期的全局变量进行初始化。如果包含了StdLib.h文件,代码就能访问这些变量了(WinMain等那四个函数)
4.       对C运行期内存单元分配函数(malloc和calloc)和其它低层输入/输出例程使用的内存栈进行初始化。
5.       为所有全局和静态c++类对象调用构造函数。
完成以上的功能后,c/c++启动函数就调用应用程序的进入点函数。
 
进入函数返回时,启动函数便调用c运行期的exit函数,exit函数负责如下的操作
1.       调用由_onexit函数的调用而注册的任何函数
2.       为所有全局的和静态的c++类对象调用析构函数。
3.       调用OS的ExitProcess函数.
 
待续.............
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值