免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3320 | 回复: 12
打印 上一主题 下一主题

[系统] Linux系统下fork()函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-18 08:48 |只看该作者 |倒序浏览
一下C语言代码实现一个功能:输入一个数字n,然后在子进程中输出n个斐波纳契数列。例如:输入8,则输出:0 1 1 2 3 5 8 13.
代码如下:
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. int *arr;
  6. int n;
  7. void fib(int *, int );

  8. int main()
  9. {
  10.         pid_t pid;
  11.         scanf("%d",&n);
  12.         arr = (int *)malloc(sizeof(int)*n);
  13.         pid = fork();
  14.         if(pid == 0)
  15.         {
  16.                 fib(arr,n);
  17.         }
  18.         else if(pid>0)
  19.         {
  20.                 wait(NULL);
  21.                 int i;
  22.                 for(i=0;i<n-1;i++)
  23.                 {
  24.                         printf("%2d, ",arr[i]);
  25.                 }
  26.                 printf("%2d\n",arr[i]);
  27.         }
  28.         free(arr);
  29.         return 0;
  30. }

  31. void fib(int *arr, int n)
  32. {
  33.         int i;
  34.         arr[0] = 0;
  35.         arr[1] = 1;
  36.         for(i=2;i<n;i++)
  37.         {
  38.                 arr[i] = arr[i-1]+arr[i-2];
  39.         }
  40.         for(i=0;i<n-1;i++)
  41.         {
  42.                 printf("%2d, ",arr[i]);
  43.         }
  44.         printf("%2d\n",arr[i]);
  45. }
复制代码
在子进程中我输出了正确的斐波纳契数列,可是在父进程中,我却输出了n个0序列。
我怀疑是fork()函数的 copy on write 机制造成的。
但具体是什么情况我就不知道了,请指教一下啊!{:2_168:}

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2013-10-18 09:36 |只看该作者
373202184 发表于 2013-10-18 08:48
一下C语言代码实现一个功能:输入一个数字n,然后在子进程中输出n个斐波纳契数列。例如:输入8,则输出:0 1 ...


fork 之后,arr 数组就有两份了,父进程中一份,子进程中一份,这两份的内容在fork之后就没有任何关系了。

论坛徽章:
0
3 [报告]
发表于 2013-10-18 16:22 |只看该作者
回复 2# MMMIX

Thank You! Now I see .
   

论坛徽章:
0
4 [报告]
发表于 2013-10-18 17:25 |只看该作者
写了程序看了一下,变量无论是放在堆上还是栈上,parent和child中该变量的地址都是一样的,真是丝毫不差的copy。。

论坛徽章:
0
5 [报告]
发表于 2013-10-18 18:00 |只看该作者
Wisatbff 发表于 2013-10-18 17:25
写了程序看了一下,变量无论是放在堆上还是栈上,parent和child中该变量的地址都是一样的,真是丝毫不差的c ...


我也测试了一下arr的地址在子进程和父进程中的地址是一样的,但是为什么在子进程中输出正确的数列,在父进程却输出了全0的数列呢。麻烦能解释以下么?谢谢!

论坛徽章:
0
6 [报告]
发表于 2013-10-18 18:05 |只看该作者
用vfork () 可以共享数据!

论坛徽章:
0
7 [报告]
发表于 2013-10-18 18:05 |只看该作者
用vfork () 可以共享数据!

论坛徽章:
0
8 [报告]
发表于 2013-10-18 20:48 |只看该作者
回复 5# 373202184

地址(不是实际物理地址)是一样的,但是在内存的不同位置,应该是页面机制什么的。。没学过操作系统。。

论坛徽章:
0
9 [报告]
发表于 2013-10-19 11:58 |只看该作者
回复 8# Wisatbff
谢谢!

   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
10 [报告]
发表于 2013-10-19 22:33 |只看该作者
373202184 发表于 2013-10-18 18:00
我也测试了一下arr的地址在子进程和父进程中的地址是一样的,但是为什么在子进程中输出正确的数列,在父 ...


你看到的是虚拟地址。虚拟地址空间每个进程都有一份,所以 arr 的(虚拟)地址在父子进程中完全一样,但是内容不相干是完全正常的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP