在vfork下,对于return和exit的理解

fork是创建一个子进程,并把父进程的内存数据拷贝一份给子进程。

而vfork中内存数据所共享的,vfork保证子进程先运行,当子进程调用exit()或exec()后,父进程才会执行。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
int main()
{
    pid_t id=vfork();
    if(id==0)
    {
        printf("child\n");
        sleep(1);
        return 1;
    }
    else
    {
        printf("father\n");
    }
    return 0;
}

而把return 1;换成exit(1)

则能正常运行

如果在vfork子进程中return,这就意为main()函数return了,会把main函数所占用的栈清理掉,而父子进程共享,那么父进程在调用main函数时会调用子进程已清理的栈,出现错误。

return 会释放局部变量,并弹栈,回到上级函数执行。exit直接退掉。

所以,子进程调用exit没有修改函数栈,所以,父进程得以顺利执行。

时间: 2025-01-31 01:16:45

在vfork下,对于return和exit的理解的相关文章

fork和vfork,return和exit的理解

fork和vfork的差别: 1.fork是创建一个子进程,并把父进程的内存数据copy到子进程中. vfork是创建一个子进程,并和父进程的内存数据share一起. 2.vfork是这样的工作的: (1).保证子进程先执行. (2).当子进程调用exit()或exec()后,父进程往下执行. 3.fork后来采用的优化技术,这样,对于fork后并不是马上拷贝内存,而是只有你在需要改变的时候,才会从父进程中拷贝到子进程中,这样fork后立马执行exec的成本就非常小了.而vfork因为共享内存所

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);

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 p

return与exit的区别是什么?

exit()是一个函数,结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程,在父进程中wait系统调用将接受到此返回信息. return返回函数值,是关键字. 在main函数中我们通常使用return (0);这样的方式返回一个值. 但这是限定在非void情况下的也就是void main()这样的形式. exit()通常是用在子程序中用来终结程序用的,使用后程序自动结束跳会操作系统. 但在如果把exit用在main内的时候无论main是否定义成void返回的值都是有效的,并且ex

return 和 exit 的区别

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

return和exit的区别

#include<stdio.h> #include<sys/types.h> #include<sys/wait.h> #include<unistd.h> #include<signal.h> int main( void ) { daemon_init(); fprintf(stderr, "main进程[%d]\n", getpid() ); while( 1 ) { } exit(0); } int daemon_i

理解 break, continue, return 和 exit

你们知道 “break”, “continue”, “return” 和 “exit”的作用吗? 它们是功能强大的语言结构体.下面通过一个测试函数来说明它们之间的不同. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 'Starting' function Test-Function {     $fishtank = 1..10     Foreach ($fish in $fishtank)     {   

关于return和exit

关于return和exit 在子进程退出的时候有两种方式,exit和exec族函数,不能使用return,为什么不能用return呢,exit改成return 会出现父子进程又各自重复开始进行. 1.exit函数和return函数的主要区别是: 1)exit用于在程序运行的过程中随时结束程序,其参数是返回给OS的.也可以这么讲:exit函数是退出应用程序,并将应用程序的一个状态返回给OS,这个状态标识了应用程序的一些运行信息. main函数结束时也会隐式地调用exit函数,exit函数运行时首先

Linux下为何都是文件的理解

所谓“文件”,就是在我们的电脑中,以实现某种功能.或某个软件的部分功能为目的而定义的一个单位. Linux都是以文件的形式存在,当我们访问某个文件(Linux中的文件有目录,连接,普通文本),由于Linux的文件的类型 而区分:如连接文件等,那使用这个文件时,那么就是调用了某个命令: 如普通文本文件时,那么当使用这个文件时,那就是访问该文件的内容 由于文件的类型的不同,从而区别于window系统下的应用:如播放器,EditPlus,浏览器,文件夹等,这些在Linux中都有 对于的不同类型的文件!