欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

程序的开始和结束

程序员文章站 2024-01-23 19:57:52
...

1.main函数由谁调用
(1)编译链接时的引导代码:操作系统性在执行main函数前其实也要先执行一段引导代码才能执行main,链接时由连接器将编译器中事先准备好的引导代码给链接进去和我们的应用程序一起构成最终的可执行程序。

gcc -v 要编译的文件
来查看编译链接时里面的内容

(2)运行时的加载器:加载器是操作系统中的程序,当我们执行一个程序时(譬如./a.out,譬如代码中用exec族函数来运行时)加载器负责将这个程序加载到内存中去执行这个程序。
(3)程序在编译时用到链接器,运行时用加载器,这两个东西对程序运行原理非常重要。
(4)argc和argv的传参如何实现
先传送到加载器再到引导代码在传给main

2.程序如何结束
(1)正常终止:return、exit、_exit
(2)非正常终止:自己或他人发信号终止进程

3.atexit注册进程终止处理函数
(1)实验演示

#include <stdio.h>
#include <stdlib.h>

void func1(void)
{
        printf("func1\n");
}

void func2(void)
{
        printf("func2\n");
}

int main(void)
{
        printf("hello world\n");

        // int atexit(void (*function)(void));
        // 当进程被正常终止时,系统会自动调用这里注册的func1执行
        atexit(func1);  //先注册的被后执行
        atexit(func2);  //后注册的被先执行
        printf("asdfs\n");

        return 0;
}

```![结果展示](https://img-blog.csdnimg.cn/b0aa4282efa744bbaaa25dee43fc2e53.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_Q1NETiBAd2VpeGluXzU0OTg5NjI2,size_40,color_FFFFFF,t_70,g_se,x_16#pic_center)


(2)return、exit、_exit的区别
return和exit效果一样,都是会执行进程终止处理函数,但是_exit终止进程时并不执行atexit·注册的进程终止处理函数。