exit(),_exit(),_Exit()

关于exit(),_exit(),_Exit()


author: i.sshe
email: [email protected]
github: https://github.com/isshe


  1. 综述: _exit()和_Exit()立即进入内核,exit()则先执行一些清理处理,然后返回内核.
    1). exit(): 正常终止进程。所有atexit()和on_exit()注册的处理函数都会被反序调用.总会执行一个标准I/O库的清理关闭操作:对所有打开流调用fclose()函数.。
    2). _exit()/_Exit(): 立刻(immediately)终止进程。不进行终止处理。
  2. 函数原型
    1).exit(): statue&0377的值(状态)返回给父进程。(注意exit()是没有返回值的)

        #include <stdlib.h>
        void exit(int status);

    2)._exit()/_Exit():

       #include <unistd.h>
       void _exit(int status);
       #include <stdlib.h>
       void _Exit(int status);
  3. 图示:一个C程序是如何启动和终止的
    这里写图片描述

4. exit()/_exit()/_Exit()
 1).示例代码:

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

int main(void)
{
     pid_t  p1 ;
     pid_t  p2 ;

     p1 = fork();
     if (p1 == 0)
     {
          printf("_exit()1!\n");
          printf("_exit()2!");//注意这里没有\n
          _exit(1);
     }
     else if (p1 > 0)
     {
          p2 = fork();
          if(p2 == 0)
          {
              printf("_Exit()1!\n");
              printf("_Exit()2!");
              _Exit(2);
          }
          else if (p2 > 0)
          {
               printf("exit()1\n");
               printf("exit()2");
               exit(3);
          }
          else
          {;}
     }
     else
     {;}
}

 2).结果截图:
这里写图片描述

 3). 结果分析:
 exit()终止进程时,清理了I/O缓冲区,而_exit()和_Exit()则没有清理缓冲区.
 所以,exit()输出了两个,_exit(),_Exit()只输出一个.

5. atexit()
 1). 终止处理程序实例:

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

static void my_exit1(void);
static void my_exit2(void);
static void my_exit3(void);

int main(void)
{
     if (atexit(my_exit2) != 0)
     {
         printf("注册my_exit2失败!\n");
     }

     if (atexit(my_exit1) != 0)
     {
          printf("注册my_exit1失败!\n");
     }

     if (atexit(my_exit3) != 0)
     {
          printf("注册my_exit3失败!\n");
     }

     printf("main is done!\n");

     exit(0);
  //  return 0;
}

static void my_exit1(void)
{
     printf("I am my_exit1()!\n");
}

static void my_exit2(void)
{
     printf("I am my_exit2()!\n");
}

static void my_exit3(void)
{
     printf("I am my_exit3()!\n");
}

 2). 结果截图:
这里写图片描述

 3). 结果分析:
 进程终止处理函数的调用顺序和注册时候相反.

注意:内核使程序执行的唯一方法是调用一个exec函数.

  1. 参考资料:
    <<unix环境高级编程 第三版>>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章