网络编程中return函数和exit函数的区别

来源:互联网 发布:大数据信用查询平台 编辑:程序博客网 时间:2024/06/06 05:24

区别:
exit函数在头文件stdlib.h中。
exit(0):正常运行程序并退出程序;
exit(1):非正常运行导致退出程序;
return():返回函数,若在main主函数中,则会退出函数并返回一值,可以写为return(0),或return 0。
详细说:
1. return返回函数值,是关键字;exit是一个函数。
2. return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。
3. return是函数的退出(返回);exit是进程的退出。
4. return是C语言提供的,exit是操作系统提供的(或者函数库中给出的)。
5. return用于结束一个函数的执行,将函数的执行信息传出个其他调用函数使用;exit函数是退出应用程序,删除进程使用的内存空间,并将应用程序的一 个状态返回给OS,这个状态标识了应用程序的一些运行信息,这个信息和机器和操作系统有关,一般是 0 为正常退出,非0 为非正常退出。
6. 非主函数中调用return和exit效果很明显,但是在main函数中调用return和exit的现象就很模糊,多数情况下现象都是一致的。

当在vfork函数中调用exit函数和return函数时需要特别注意!
vfork函数父子进程共享物理内存,因此若在子进程用return函数的话,父进程子进程的栈都会被修改,导致父进程再次return 0 时会出现段错误。
再回到 return 和 exit,return会释放局部变量,并弹栈,回到上级函数执行。exit直接退掉。如果你用c++ 你就知道,return会调用局部对象的析构函数,exit不会。(注:exit不是系统调用,是glibc对系统调用 _exit()或_exitgroup()的封装)。
可见,子进程调用exit() 没有修改函数栈,所以,父进程得以顺利执行。

另外网上大牛还有另外一种解释:
实际上子进程return只会导致子进程自己的相关寄存器(特别是esp、ebp)被更改,不会对共享的栈内存空间的内容产生影响。而子进程修改自己的寄存器并不影响父进程的寄存器,所以本来return是不会导致问题的。问题出在当子进程return返回到main()函数的调用点之后,接下来的语句中会有一些别的函数调用,这个时候main()原来的栈内存空间内容被覆盖(主要是返回地址),导致了程序的不确定行为。
链接:https://www.zhihu.com/question/26591968/answer/33867796

另外还想说一下return在子函数中的返回机制:

  1. 函数中定义的局部变量:
    Linux等的C语言中return返回值的机制为:将返回值存入eax寄存器中,然后系统再将eax中的值赋给变量(i)。
  2. 函数内部返回局部指针(或数组)的过程:
    在执行return语句时,首先将return后面的地址值返回存入到比如eax寄存器中,然后系统再将eax中的地址值给接收函数返回地址的指针变量。这看起来都没什么问题,但问题在于两个方面:
    [1]接收函数返回地址值的指针变量要访问此地址中的内容。
    [2]子函数运行结束后,一切有关于局部变量的内存都已经释放回收。那么在用这个地址来操作就很危险:地址中没有内容。
原创粉丝点击