You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用vfork()时父进程输出q为垃圾值,而fork()时为20?

vfork()与fork()导致父进程q值差异的原因解释

先看问题中的代码:

int main()
{
    int p,q=20; 
    p=fork();
    if(p==0)
    {
        q=100;
        printf("q=%d\n",q);
    }
    else
    {
        wait(NULL);
        p=vfork();
        if(p==0)
        {
            q=200;
            printf("q=%d\n",q);
        }
        else
        {
            printf("q=%d\n",q);
        }
    }
}

核心原因在于fork()和vfork()的本质差异:

1. 用fork()时父进程q=20的原因

fork()创建子进程时,会给子进程复制一份完全独立的地址空间,父进程和子进程的内存是相互隔离的:

  • 第一个fork的子进程修改q=100,只会改动自己空间里的q,父进程的q始终是初始值20。
  • 哪怕把第二个vfork换成fork,新子进程同样拥有独立内存,修改q=200也不会影响父进程的q,所以父进程最终输出20。

2. 用vfork()时父进程q为垃圾值的原因

vfork()的设计初衷是快速创建子进程后立即调用exec系列函数,它有两个关键特性:

  • 子进程完全共享父进程的地址空间(不复制内存),子进程对内存的修改会直接影响父进程。
  • vfork会暂停父进程的执行,直到子进程调用exec()或者exit()后,父进程才会继续运行。

而问题中的代码违反了vfork的使用规则:vfork创建的子进程修改q=200后,既没有调用exec,也没有调用exit,就直接从当前代码块返回了。这种操作会破坏父进程的栈结构(因为子进程共享父进程栈,返回操作会修改栈指针、返回地址等关键数据),导致父进程恢复执行时,q的值已经被破坏,最终输出垃圾值。

内容的提问来源于stack exchange,提问作者alexa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:21:30