Linux学习_进程(1)——谁调用了main函数?

        C 语言程序总是从 main 函数开始执行,main()函数的原型是:

int main(void)

        或者

int main(int argc, char *argv[])

        如果需要向应用程序传参,则选择第二种写法。不知大家是否想过“谁”调用了 main()函数?事实上, 操作系统下的应用程序在运行main()函数之前需要先执行一段引导代码,最终由这段引导代码去调用应用程序的main()函数,我们在编写应用程序的时候,不用考虑引导代码的问题,在编译链接时,由链接器将引导代码链接到我们的应用程序当中,一起构成最终的可执行文件。

        然而,程序是如何结束的呢?

        程序结束其实就是进程终止,进程终止的方式通常有多种,大体上分为正常终止和异常终止,正常终止包括:

        1、 main()函数中通过 return 语句返回来终止进程;

         2、应用程序中调用 exit()函数终止进程;

         3、应用程序中调用_exit()或_Exit()终止进程;

        异常终止包括:

         1、应用程序中调用 abort()函数终止进程;

         2、进程接收到一个信号,譬如 SIGKILL 信号。

注册进程终止处理函数 atexit()

        注册进程终止处理函数 atexit()

#include <stdlib.h>
int atexit(void (*function)(void));

        函数参数和返回值含义如下:

        function:函数指针,指向注册的函数,此函数无需传入参数、无返回值。

        返回值:成功返回 0;失败返回非 0。

测试

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

static void bye(void){
    puts("Goodbye!");
}

int main(int argc, char *argv[]){
    if (atexit(bye)) {
        fprintf(stderr, "cannot set exit function\n");
         exit(-1);
    }

    exit(0);
}

运行结果:

        

         需要说明的是,如果程序当中使用了_exit()或_Exit()终止进程而并非是 exit()函数,那么将不会执行注册的终止处理函数。       

概念 

     进程其实就是一个可执行程序的实例,这句话如何理解呢?可执行程序就是一个可执行文件,文件是一个静态的概念,存放磁盘中,如果可执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值