linux中vfork对打开文件的处理

vfork和fork

  fork()函数是拷贝一个父进程的副本,拥有独立的代码段 数据段 堆栈空间 然而vfork是共享父亲进程的代码以及代码段

  vfork是可以根据需要复制父进程空间,这样很大程度的提高勒性能。

1 例子vfork检测 子进程和父进程值是否一样

 1 #include <sys/types.h>
 2 #include <stdio.h>
 3 #include <unistd.h>
 4 #include <error.h>
 5 #include <fcntl.h>
 6 #include <string.h>
 7 #include <stdlib.h>
 8 
 9 int glob = 8;//全局已经初始化的变量 位于数据段
10 int main()
11 {
12     int var;
13     pid_t pid;
14     var = 99;
15     printf("最开始的glob=%d	var=%d
",glob,var);//输出初始的值
16     if((pid=vfork())<0)
17     {
18         perror("vfork");
19         exit(EXIT_FAILURE);
20     }else if(pid==0)
21     {
22         printf("在子进程中,修改后的glob和var为
");
23         glob++;//子进程修改全局变量
24         var++;//子进程修改局部变量
25         printf("在子进程中	glob=%d	var=%d
",glob,var);
26         _exit(0);
27     }else//父进程打印
28     {
29         printf("在父进程中	glob=%d	var=%d
",glob,var);
30         return 0;
31     }
32     return 1;
33 }

结果发现:子进程和父进程共享数据空间

2 当把上面的代码vfork改变为fork后的执行结果如下:

结果发现:fork函数创建子进程时候 子进程是父进程的一份拷贝

原文地址:https://www.cnblogs.com/lanjianhappy/p/6874217.html