首页 > 代码库 > 进程-(3)

进程-(3)

1.  进程退出的方式

1) 正常退出
在main函数中执行return
调用exit函数,并不处理文件描述符,多进程
调用_exit或_Exit.
进程的最后一个线程执行了返回语句
进程的最后一个线程调用pthread_exit函数

2) 非正常退出
调用abort,产生SIGABRT信号
进程接收到某些信号
最后一个线程对“取消”请求做出响应


3) exit()和_Exit() _exit() 退出的区别:
_Exit() _exit()本质是一样的。
exit()函数在退出前允许调用其他的函数做一些收尾工作,_exit()函数要求立即退出进程。
exit()退出前可以调用atexit()注册的函数。
return 其实也会调用atexit()注册的函数。

 

代码说明:

例子1:exit() 函数查看退出
#include<stdio.h>
#include<stdlib.h>
int main()
{
  printf("begin\n");
  exit(0);
  printf("end\n");
  return 0;
}

[root@aiyq195 day07]# vi exit1.c
[root@aiyq195 day07]# gcc exit1.c -o exit1
[root@aiyq195 day07]# ./exit1
begin

上面结果说明了,调用了exit(),相当于在这一点就选择了return的作用,退出了程序。

例子2:exit()函数,调用atexit() 函数的效果
#include<stdio.h>
#include<stdlib.h>
void at()
{
  printf("at is called\n");
}
int main()
{
  atexit(at);//注册了退出前调用的函数
  printf("begin\n");
  exit(0);
  printf("end\n");
  return 0;
}


[root@aiyq195 day07]# vi exit2.c
[root@aiyq195 day07]# gcc exit2.c -o exit2
[root@aiyq195 day07]# ./exit2
begin
at is called

上面的结果说明:
执行exit() 函数,程序退出时,可以调用一个函数-atexit()函数,在退出时,调用该函数内的数据;


例子3:_exit() 函数,强制退出
#include <stdio.h>
#include <stdlib.h>

void at()

{
  printf("at is called\n");
}
int main()

{
  atexit(at);//注册了退出前调用的函数at
  printf("begin\n");
  _Exit(0);//立即退出,不调用at()
  printf("end\n");
  return 0;//效果等同于exit()
}
[root@aiyq195 day07]# gcc exit.c -o exit
[root@aiyq195 day07]# ./exit
begin
结果表示:
_exit() 函数,是强制退出,就算有atexit() 函数,也不会调用,相当于机器没有备用电源,直接断电;

 

例子4: 如果没有用exit等函数,只有return,会如何
#include <stdio.h>
#include <stdlib.h>

void at()

{
  printf("at is called\n");
}
int main()
{
  atexit(at);//注册了退出前调用的函数at
  printf("begin\n");
  printf("end\n");
  return 0;//效果等同于exit()
}

[root@aiyq195 day07]# vi exit3.c
[root@aiyq195 day07]# gcc exit3.c -o exit3
[root@aiyq195 day07]# ./exit3
begin
end
at is called

结果说明:
return函数,相当于exit,退出还是会调用atexit函数,也就是说,atexit函数,会在退出时,被吊起,但是,需要查看如何退出,如果是_exit() 函数退出,则不会被吊起;

 

进程-(3)