return和exit函数的区别

在上Linux课的时候,老师提到一句,调用vfork产生的子进程就是为了使用exec族函数来执行其他的代码逻辑。

在子进程退出的时候有两种方式,exit和exec族函数,不能使用return,为什么不能用return呢,为什么只有vfork会不让用return呢?

于是我就写了这样的代码

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4
  5
  6 int main()
  7 {
  8   pid_t pid;
  9   pid=vfork();
 10   if(pid==0)
 11   {
 12     //child
 13     printf("I am child pid:%d\n",getpid());
 14 ····
 15     return 0;16   }
 17   else
 18   {
 19     //father
 20     printf("I am father pid:%d\n",getpid());
 21   }
 22   return 0;
 23 }                                                                                

不出所料出错了

而且根据操作系统的版本不同,出错结果可能不同,有的系统可能会死循环,一直交替输出上面图中的两句话。

那么,为什么呢?return 和 exit 函数都可以让一个进程结束,为什么结果会有这么大的差距呢?而且为什么fork没事,vfork就会有错呢?

首先先找他们之间的不同点,fork和vfork最大的不同当然就是父子进程的地址空间问题了vfork产生的子进程和父进程共用同一个地址空间,那么也就是说,从地址空间的底部到顶部,全是通用的,一个改了,另外一个的数据也就被修改了。

然后我们再看return 和 exit ,简单的来说都是退出用的,会刷新缓冲区之类的,然后退出,但是!从字面意思可以看出return有返回的意思,我之前的博客讲述过函数栈帧的构造方式,当函数返回上一级调用它的函数的时候,栈帧中的指针会产生移动,“返回”的意义就在这里!!!返回上一级调用它的函数,然后修改栈帧指针以返回,那么再看之前说的vfork产生的子进程和父进程是共用地址空间的,那么栈也包含在里面咯~,子进程一旦使用return就会把栈(其中的函数栈帧,尤其是main)改写!简单的说就是子进程把main干掉的时候顺手就把父进程也拉上了,父进程表示什么都不知道就死了。。。这时候系统会报段错误,但是有的操作系统会让父进程回到main重新执行,所以就死循环了。。。

请大家批评指正。。。

时间: 2024-12-29 15:53:37

return和exit函数的区别的相关文章

Linux 下用vfork()创建进程,子进程用return和exit返回的区别

1 #include <stdio.h> 2 #include <unistd.h> 3 #include <sys/types.h> 4 #include <error.h> 5 6 int main() 7 { 8     pid_t id=vfork(); 9     if(id==29){//child 10         printf("child:hello world\n"); 11         //exit(0);

return 和 exit 的区别

exit()          表示结束当前进程或当前程序,在整个程序中,只要有 exit,就退出,并将应用程序的一个状态返回给OS.一般 和操作系统相关的是0为正常退出,非0为非正常退出. return:     表示调用堆栈的返回.例如当程序进入函数调用时,当函数 调用结束,则return,返回上一层的调用.如果是在main函数 中,return则是结束当前进程. main函数的结束也会隐式的调用exit函数. return 和 exit 的区别,布布扣,bubuko.com

exit()与_exit()函数的区别(Linux系统中)

注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_SUCCESS);可读性比较好一点. 作为系统调用而言,_exit和exit是一对孪生兄弟,它们究竟相似到什么程度,我们可以从Linux的源码中找到答案: #define __NR__exit __NR_exit /* 摘自文件include/asm-i386/unistd.h第334行 */

循环结构中break、continue、return和exit的区别

1.break语句 break语句使用场合主要是switch语句和循环结构.break语句,那么直接退出循环,执行循环结构下面的第一条语句.如果在多重嵌套循环中使用break语句,当执行break语句时,退出的是它所在的循环结构,对外层循环没有影响. 2.continue语句 continue语句并没有真的退出循环,而是只结束本次循环的执行,所以使用continue时要注意这一点. 3.return语句 如果在程序中遇到return语句,那么戴拿就退出该函数的执行,退回到函数的调用处,如果是ma

Linux C _exit函数与exit函数的联系与区别

一.联系 1.功能上,_exit和exit函数都是让进程正常退出,即关闭进程所打开的文件描述符,释放已占用内存和其他资源. 二.区别 1._exit函数在头文件unistd.h中声明,而exit在头文件stdlib.h中声明. 2.执行_exit函数后,控制权立即返回给内核,而exit函数要先执行一些清除操作,然后才将控制权交给内核. 3._exit函数不会刷新I/O缓冲区,可能造成数据丢失,而exit函数是在_exit函数之上的一个封装,它在调用_exit函数之前,会先刷新I/O缓冲区,保证了

PHP中return,exit,die的区别

参考:die(),exit(),return的区别 1.die() 是遇到错误才停止,停止程序运行,输出内容(是程序级别的) 2.exit,exit():是一个函数 是停止程序运行,前者不输出内容:后者输出内容(是程序级别的) exit(0):正常运行程序并退出程序:     exit(1):非正常运行导致退出程序: 3.return:只是一个关键字        return就是纯粹的返回值了,但是也不会运行后续代码(是函数级别的) 补充:  1. return是语言级别的,它表示了调用堆栈的

break,continue,return和exit的区别

1.break break语句的使用场合主要是switch语句和循环结构. 在循环结构中使用break语句,就退出循环,接着执行循环结构下面的第一条语句. 如果在多重嵌套循环中使用break语句,当执行break语句的时候,退出的是它所在的循环结构,对外层循环没有任何影响. 如果循环结构里有switch语句,并且在switch语句中使用了break语句,当执行switch语句中的break语句时,仅退出switch语句,不会退出外面的循环结构. 2.continue continue语句结束循环

Windows下return,exit和ExitProcess的区别和分析

通常,我们为了使自己的程序结束,会在主函数中使用return或调用exit().在windows下还有ExitProcess()和TerminateProcess()等函数. 本文的目的是比较以上几种结束程序的方式的区别,并分析其原理. 首先我们用一个例子来说明几种结束方式的区别. 测试代码如下:#include#include#include class Test{public: Test (int i) {m_i=i; printf ("construct %d\n", m_i);

exit()与_exit()函数的区别

进程就好比人一样有其生命,我们通过fork()函数来创建一个进程,那么我们又是如何来中止进程呢. 1.Linux中的进程退出 进程退出表示进程即将结束.在Linux中进程退出分为了正常退出和异常退出两种. (1)正常退出 a. 在main()函数中执行return: b.调用exit()函数: c.调用_exit()函数. (2)异常退出 a.调用about函数: b.进程收到某个信号,而该信号使程序终止. 补充:不管是那种退出方式,系统最终都会执行内核中的同一代码.这段代码用来关闭进程所用已打