在执行过程中,fork()和vfork()函数有一定的区别,fork()函数是拷贝一个父进程的副本,从而拥有自己独立的代码段、数据段(.data .bss) 以及堆栈空间,即成为一个独立的实体。而vfork()是共享父亲进程的代码以及数据段(.data .bss .rodata)。
在下面的程序中, 定义了 全局已经初始化的变量glob(.data)和 全局未初始化变量 glox(.bss), 在main中的局部变量var(.stack),常量("hello linux")
使用vfork新建一个新的进程,在子进程中分别修改这些变量,然后打印这些变量,在父进程中 打印这些变量,发现:
子进程和父进程中的变量都是一样的
说明:
使用vfork()产生的 子进程是共享父进程的 数据段(.rodata .data. .bss)和代码段
如果将vfork()修改为 fork(),发现 父进程和子进程中的数据变量是一样的。 说明: fork()是拷贝父进程的副本
- #include <stdio.h>
-
#include <unistd.h>
-
#include <stdlib.h>
-
#include <sys/types.h>
-
#include <errno.h>
-
-
int glob = 6;//glob in .data
-
int glox; //not init in .bss
-
int main(int argc, char *argv[])
-
{
-
int var = 88; //local varliable in .stack
-
char str[12] = "hello linux!"; // hello linux in .rodata
-
// str in .stack
-
pid_t pid;
-
printf("in beginging the glob is %d, the local var is %d glox=%d\n",glob,var,glox);
-
printf("in beginging the str is %s\n\n",str);
-
-
if((pid = vfork())<0)
-
{
-
perror("vfork");
-
exit(EXIT_FAILURE);
-
}
-
else if(pid == 0)
-
{
-
printf("child ++glob=%d,++var=%d ++globx=%d\n",++glob,++var,++glox);
-
str[0] = '2';
-
printf("child str changed %s\n\n",str);
-
exit(EXIT_SUCCESS);
-
}
-
else
-
{
-
printf("parent glob=%d,var=%d glox=%d\n",glob,var,glox);
-
printf("parent str %s\n",str);
-
exit(EXIT_SUCCESS);
-
}
-
}
- ywx@ywx:~/Desktop/yu/process$ ./test1
-
in beginging the glob is 6, the local var is 88 glox=0
-
in beginging the str is hello
-
-
child ++glob=7,++var=89 ++globx=1
-
child str changed 2ello
-
-
parent glob=7,var=89 glox=1
-
parent str 2ello
阅读(1746) | 评论(0) | 转发(1) |