return和exit的区别

转载:https://blog.csdn.net/tonglin12138/article/details/86545526

1.return()

  • return 表示把程序流程从被调函数转向主调函数并把表达式的值带回主调函数,实现函数值的返回,返回时可附带一个返回值,由return后面的参数指定。
  • return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。 如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况。

2.exit()

  • exit() 是电脑函数,操作系统提供的。
  • exit()通常是用在子程序中用来终结程序用的,使用后程序自动结束,跳回操作系统。
  • exit(0) 表示程序正常退出,exit⑴/exit(-1)表示程序异常退出。
  • exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束。
    注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_SUCCESS);

3.return()和exit()的区别

1.return是语言级别的,是关键字,它表示了调用堆栈的返回,return用于结束一个函数的执行,将函数的执行信息传出个其他调用函数使用,如果返回的是main函数,则为退出程序。
2.而exit是系统调用级别的,是一个函数,它表示了一个进程的结束。 exit是在调用处强行退出程序,运行一次程序就结束。这个状态标识了应用程序的一些运行信息,这个信息和机器和操作系统有关。

  1. return是C语言提供的,exit是操作系统提供的(或者函数库中给出的)。
    4.return用于结束一个函数的执行,将函数的执行信息传出个其他调用函数使用;exit函数是退出应用程序,删除进程使用的内存空间,并将应用程序的一个状态返回给OS,这个状态标识了应用程序的一些运行信息,这个信息和机器和操作系统有关,一般是 0 为正常退出,非0 为非正常退出。
    5.return和exit()的另一个区别在于,即使在除main()之外的函数中调用exit()它也将终止程序。
  2. 非主函数中调用return和exit效果很明显,但是在main函数中调用return和exit的现象就很模糊,多数情况下现象都是一致的。按照ANSI C,在最初调用的main()中使用return和exit()的效果相同。
    但要注意这里所说的是“最初调用”。如果main()在一个递归程序中,exit()仍然会终止程序;但return将控制权移交给递归的前一级,直到最初的那一级,此时return才会终止程序。

4._exit()与exit()的区别

头文件:

  • exit:#include<stdlib.h>
  • _exit:#include<unistd.h>
    _exit()函数:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;
    exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。
    exit()函数与_exit()函数最大的区别:就在于 exit()函数在调用 exit 系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件。

进程终止有5种方法:

  • 正常终止
    (1)从main函数返回
    (2)调用exit
    (3)调用_exit
  • 异常终止
    (1)调用abort
    (2)由一个信号来终止
  • exit和_exit就是用来正常终止一个进程的,主要区别是_exit会立刻进入内核,而exit先执行一些清除工作(包括执行各种终止处理程序,关闭所有标准I/O等,一旦关闭了IO,例如Printf等函数就不会输出任何东西了),然后才进入内核。这两个函数会对父子进程有一定的影响,当用vfork创建子进程时,子进程会先在父进程的地址空间运行(这跟fork不一样),如果子进程调用了exit就会把父进程的IO给关掉。
  • 这两个函数都带一个参数表示终止状态,这跟我们平时写的return效果是一样的,如果不返回一个终止状态,那表示这个进程的终止状态就是未定义的。
    exit()与_exit() 实例分析
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>


int main()
{

     pid_t result;
     result = fork();
     if(result<0)
     perror("fork");
     if(result == 0)
     {
             printf("This is _exit test\n");
             printf("This is the content in the buffer000");
            _exit(0);
     }
     else
     {
             printf("This is exit test\n");
             printf("This is the content in the buffer");
             exit(0);
     }
     return 0;
}

结果分析:
子进程中运行_exit(0)并未将Thisis the content in the buffer000 打印出来,而父进程中运行的exit(0)将Thisis the content in the buffer打印出来了。说明,exit(0)会在终止进程前,将缓冲I/O内容清理掉,所以即使printf里面没有 \n也会被打印出来,而_exit(0)是直接终止进程,并未将缓冲I/O内容清理掉,所以不会被打印出来。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 文/tangsl(简书作者) 原文链接:http://www.jianshu.com/p/2b993a4b913e...
    西葫芦炒胖子阅读 3,829评论 0 5
  • Linux 进程管理与程序开发 进程是Linux事务管理的基本单元,所有的进程均拥有自己独立的处理环境和系统资源,...
    JamesPeng阅读 2,517评论 1 14
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,966评论 0 38
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,507评论 0 5
  • 说起佩服的人,我首先想到的是颜宁,可以说她是我唯一真正意义上钦佩的人。 颜宁现在42岁,是普林斯顿的生物教授,美女...
    李二维阅读 719评论 0 6