关于vfork函数的一个问题。
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> int main() { int g_val = 100; pid_t id = vfork(); if (id == 0) { g_val++; printf("child runing first...%d:%p\n", g_val, &g_val); sleep(1); //exit(0); return 0; } else { printf("father runing first...%d:%p\n", g_val, &g_val); } return 0; }
首先说一下fork和vfork的差别:
- fork 是 创建一个子进程,并把父进程的内存数据copy到子进程中。
- vfork是 创建一个子进程,并和父进程的内存数据share一起用。
这两个的差别是,一个是copy,一个是share。
你 man vfork 一下,你可以看到,vfork是这样的工作的,
1)保证子进程先执行。
2)当子进程调用exit()或exec()后,父进程往下执行。
问题来了,如果子进程没有调用exit退出,而是return返回,那么在有些系统,例如CentOS上会陷入一个死循环当中,更有甚着,直接会报一个段错误,如Ubuntu上。这是为什么呢?
在CentOS上:
木有配图=_=|| 死循环!
在Ubuntu上:
仔细分析过后,原因如下:
- 父子进程共享地址空间,子进程从main函数返回后,背后又调用了exit(函数),如此父进程才会开始运行。
- return之后,此地址空间被销毁,main函数栈帧被清退,运气好的话(看系统版本)还是有可能继续运行的,运气不好就是段错误了。
- exit函数没有清退栈帧,所以将return改为exit,父进程还可以继续运行。
由此得出一个结论:vfork用的不好会坑爹!
vfork死循环问题
最新推荐文章于 2023-01-28 17:59:07 发布