返回列表 发帖

windows下进程启动以及运行和退出的简单描述

windows下进程启动以及运行和退出的简单描述 首先这里是一些全局变量的输出,从中我们可以获取一些有用的信息:) #include "stdio.h" #include "stdlib.h" int main( int argc , char ** argv ) { int i ; printf("系统测试版本号:%d\n",_osver); printf("十六进制windows主要版本:%d\n",_winmajor); printf("十六进制windows次要版本:%d\n",_winminor); printf("命令行传输的参数号:%d\n",_winver); printf("参数个数:%d\n",argc); printf("参数:\n"); for(i = 1; i < argc; i++) printf("\t%s\n",argv); printf("程序运行路径:%s\n",_pgmptr); printf("环境字符串:\n"); for(i = 0; _environ != NULL; i++) printf("%s\n",_environ); return 0; } 实际上上面这些变量是c/c++运行期库的全局变量,在你的代码中的mian,winmain等入口函数之前,系统会首先调用c/c++运行期启动函数.该函数会对c/c++运行期库进行初始化.他确保已经声明的任何全局变量和静态c++对象在代码执行前被正确创建. 这些启动函数功能如下: ? 检索指向新进程的完整命令行的指针。 ? 检索指向新进程的环境变量的指针。 ? 对C/C++运行期的全局变量进行初始化。如果包含了StdLib.h 文件,代码就能访问这些变量。 ? 对C 运行期内存单元分配函数(malloc 和calloc )和其他低层输入/输出例程使用的内存栈进行初始化。 ? 为所有全局和静态C++类对象调用构造函数。 初始化之后开始执行你的入口函数的代码也许看起来是这样子的: 比如你的入口函数为int __cdecl main(int argc, char** argv, char**envp) 则真正的代码是如下的样子: GetStartUpInfo(&StartUpInfo); int nMainRetVal = main(__argc, __argv, _envp); 当你的入口函数返回之后,启动函数便调用c runtime的exit函数,并将上面的返回值nMainRetVal 传给他。而exit主要负责下面这些操作: ? 调用由_onexit函数的调用而注册的任何函数。 ? 为所有全局的和静态的C++类对象调用析构函数。 ? 调用操作系统的ExitProcess函数,将nMainRetVal传递给它。这使得该操作系统能够撤消进程并设置它的exit 代码。 参考资料:<>

windows下进程启动以及运行和退出的简单描述

[这个贴子最后由默数悲伤在 2006/01/17 08:02pm 第 1 次编辑] 在\VC98\CRT\SRC目录下的crt0.c文件中有这些启动函数的详细说明 比如上面说的几个全局变量,在调用入口函数之前的初始化代码如下: _osver = GetVersion(); _winminor = (_osver >> 8 ) & 0x00FF ; _winmajor = _osver & 0x00FF ; _winver = (_winmajor << 8 ) + _winminor; _osver = (_osver >> 16 ) & 0x00FFFF ;

TOP

返回列表 回复 发帖