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 代码。
参考资料:<>
|