• Balabala函数的启动和退出机制


           在linux系统中,启动一个可执行程序program,便在内核中生成一个进程process,且被内核赋予一个唯一的非负整数的进程号PID(process ID)。内核通过一个task_struct结构体(进程表项/进程控制块)维护和记录该进程的所有信息,例如进程状态state,优先级priority,终端信息tty_struct,目录信息fs_struct,文件信息files_struct,内存映射mm_struct,信号信息signal_struct等。

          言归正传。当一个程序执行前,即运行main函数前,内核会先行启动一个特殊的例程☞启动例程。对了,它的作用有三:

        1/将命令行上的函数参数传给argc,argv;

        2/创建环境表传递给函数;

        3/登记进程的终止函数

    之后内核便正常启动我们的进程!

          那么进程又是如何结束的呢?

          一般进程的结束分为三种☞

    1/正常结束;即通过return  exit  _exit(_Exit)  pthread_exit返回,或者是通过最后一个线程的启动例程返回;

    2/异常结束;通过调用abort,或发送终止信号,取消请求的响应;

    3/进程返回。正常返回0,不正常返回非0。

    一个例子☞

    Q:如何定义自己的终止函数?

    A:int atexit(void (*term_function)(void))

    通过atexit()函数可以像内核自定义注册终止函数,也可以在同一个程序中注册多个自定义终止函数,它们按照先注册后运行的栈方式在程序调用exit或return后运行。需要特别注意的是如果程序中调用的是系统退出函数_exit,则我们自定义的终止函数将不会被执行,且也不会refresh程序的缓冲区(可以在程序结束前调用fflush强制refresh)。

    无图无真相!

    6217760-2f7c3a9ba44db2ed.png
    term123为自定义终止函数

    6217760-77b655c7ea8e4b99.jpg
    1.栈方式调用term函数;2.程序调用_exit退出时,不执行term函数。
  • 相关阅读:
    扫描线与悬线
    随机搜索与模拟退火
    树的直径相关
    分数规划及斜率优化
    数学-剩余系
    后缀数据结构
    AC自动机和KMP
    生命游戏和随机数之间某种不可言说的秘密
    转移了
    BZOJ 1710: [Usaco2007 Open]Cheappal 廉价回文
  • 原文地址:https://www.cnblogs.com/leon1124/p/14039889.html
Copyright © 2020-2023  润新知