有时候我们为了弄懂一篇文章,大可去man 里边查看

man函数如果是英文的也没有关系,因为man函数是为全世界的程序员编写的,不会是很难的英语,所以加油哦(也可以去安装翻译过后的man)

1.exit()函数

exit()函数,_exit()函数,return关键字,abort()函数的区别

exit()函数,_exit()函数,return关键字,abort()函数的区别


这是man手册中对exit()函数的描述,exit()函数导致子进程的正常退出,并且参数status&这个值将被返回给父进程。exit()应该是库函数。exit()函数其实是对_exit()函数的一种封装(库函数就是对系统调用的一种封装)。



2._exit()函数:

exit()函数,_exit()函数,return关键字,abort()函数的区别

这是手册对_exit()函数的描述,意思是_exit()函数终止调用的进程,进程所有的文件描述符(在linux中一切皆文件)都被关闭, 这个进程的所有子进程将被init(最初的进程,所有的进程都是来自init进程,所有的进程都由其父进程创建,即init进程是所有进程的祖先!)进程领养,并且这个终止的进程将向它的父进程发送一个sigchld信号。_exit()的参数status被返回给这个终止进程的父进程来作为这个终止进程的退出状态,这个退出状态值能被wait()函数族的调用收集(就是通过wait()函数来获得子进程的退出状态,之后wait()函数将会释放子进程的地址空间,否则会出现zoom进程)。  _exit()函数是系统调用。会清理内存和包括pcb(内核描述进程的主要数据结构)在内的数据结构,但是不会刷新流,而exit()函数会刷新流。比如exit()函数会将I/O缓冲中的数据写出或读入(printf()就是I/O缓冲,遇到‘\n’才会刷新,若直接调用exit()则会刷新,而_exit()则不会刷新)


例子:

exit()函数,_exit()函数,return关键字,abort()函数的区别

运行结果:

exit()函数,_exit()函数,return关键字,abort()函数的区别

exit()函数,_exit()函数,return关键字,abort()函数的区别

运行结果:

exit()函数,_exit()函数,return关键字,abort()函数的区别

因为遇见\n。printf函数才会将缓存中的数据输出出来。

而_exit会导致第二个printf函数缓存区的数据直接丢失,函数也由内核直接关闭。



3.return 关键字:

return 不是系统调用,也不是库函数,而是一个关键字,表示调用堆栈的返回(过程活动记录),是函数的退出,而不是进程的退出。


return函数退出,将函数的信息返回给调用函数使用,与exit()和_exit()函数有本质区别。



4.abort()函数:

exit()函数,_exit()函数,return关键字,abort()函数的区别

  abort()函数用于异常退出。返回一个错误代码。错误代码的缺省值是3。abort()函数导致程序非正常退出除非sigabrt信号被捕捉到,并且信号处理函数没有返回(即abort()函数给自己发送sigabrt信号),如果abort()函数导致程序终止,所有的打开的流将被关闭并且刷新。

例如:

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

int main ()
{
   FILE *fp;
   
   printf("准备打开 nofile.txt\n");
   fp = fopen( "nofile.txt","r" );
   if(fp == NULL)
   {
      printf("准备终止程序\n");
      abort();
   }
   printf("准备关闭 nofile.txt\n");
   fclose(fp);
   
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果,因为我们尝试打开的文件 nofile.txt 是不存在的:

准备打开 nofile.txt
准备终止程序

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-12-17
  • 2022-02-22
  • 2022-12-23
  • 2021-09-10
猜你喜欢
  • 2021-10-18
  • 2021-07-03
  • 2022-12-23
  • 2021-12-09
  • 2022-12-23
  • 2021-08-08
  • 2021-09-14
相关资源
相似解决方案