Chinaunix首页 | 论坛 | 博客
  • 博客访问: 61172
  • 博文数量: 96
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 852
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-13 20:47
个人简介

扎斯特都恩特

文章分类

全部博文(96)

文章存档

2018年(1)

2017年(2)

2016年(82)

2015年(11)

我的朋友

分类: LINUX

2015-08-09 09:51:19

一、fork vs vfork

1、使用vfork时,父、子进程中不能同时使用return,否则会报--Segmentation fault。--why???(暂时还没整明白!)
2、使用vfork时,确保子进程先执行--父、子进程共享地址空间,父进程阻塞,等子进程退出后,父进程才继续执行
     如果子进程没有执行exec或者exit,这时在进程中请求父进程中的资源,会导致死锁!(父进程等子进程退出,子进程等父进程的资源)
3、fork,子进程复制父进程的所有资源(包括进程环境、内存资源)--但子进程有自己的数据段--父、子进程中修改自己变量的值,
            不会影响到对方;
     vfork,子进程不复制父进程资源,父、子进程共享地址空间,修改虚拟内存空间中变量的值,会影响到对方

二、示例

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>

  4. typedef unsigned int UINT32;
  5. UINT32 g_tmp = 10;

  6. int main()
  7. {
  8.     pid_t pid;
  9.     UINT32 tmp = 5;
  10.     pid = fork();
  11.     if(pid<0)
  12.     {
  13.         printf("fork error!\n");
  14.         exit(1);
  15.     }
  16.     else if(0==pid)
  17.     {        
  18.         printf("child process:pid=%d\n",getpid());
  19.         g_tmp++;
  20.         tmp++;
  21.         printf("g_tmp=%d\n tmp= %d\n",g_tmp,tmp);        
  22.     }
  23.     else
  24.     {
  25.         printf("parent process:pid=%d\n",getpid());
  26.         g_tmp++;
  27.         tmp++;
  28.         printf("g_tmp=%d\n tmp= %d\n",g_tmp,tmp);            
  29.     }
  30.     
  31.     return 0;
  32. }

  33. /*运行结果*
  34. child process:pid=3963
  35. g_tmp=11
  36. tmp= 6
  37. parent process:pid=3962
  38. g_tmp=11
  39. tmp= 6
  40. */


点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>

  4. typedef unsigned int UINT32;
  5. UINT32 g_tmp = 10;

  6. int main()
  7. {
  8.     
  9.     pid_t pid;
  10.     UINT32 tmp = 5;
  11.     pid = vfork();
  12.     if(pid<0)
  13.     {
  14.         printf("fork error!\n");
  15.         exit(1);
  16.     }
  17.     else if(0==pid)
  18.     {        
  19.         printf("child process:pid=%d\n",getpid());
  20.         g_tmp++;
  21.         tmp++;
  22.         printf("g_tmp=%d\n tmp= %d\n",g_tmp,tmp);
  23.         //exit(0);
  24.         return 0;        
  25.     }
  26.     else
  27.     {
  28.         printf("parent process:pid=%d\n",getpid());
  29.         g_tmp++;
  30.         tmp++;
  31.         printf("g_tmp=%d\n tmp= %d\n",g_tmp,tmp);
  32.         exit(0);
  33.         //return 0;
  34.     }
  35. }

  36. /*
  37. 运行结果
  38. child process:pid=6156
  39. g_tmp=11
  40. tmp= 6
  41. parent process:pid=6155
  42. g_tmp=12
  43. tmp= 1
  44. */






阅读(561) | 评论(0) | 转发(0) |
0

上一篇:C 语言常见编译错误

下一篇:pthread_create

给主人留下些什么吧!~~