为何使用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
相关产品推荐
相关产品推荐

