LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 706|回复: 9

请高手答疑,这段程序的结果为什么是这样?

[复制链接]
发表于 2005-1-10 07:08:02 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

static int flag;

int
main(void)
{
  int i;
  flag=5;

  for(i=0;i<5;i++){
    if(fork()==0){
      flag--;
      printf("flag=%d\n",flag);
      exit(0);
    }
  }
  exit(0);
}
编译,运行结果如下:
#./a.out
#flag=4
flag=4
flag=4
flag=4
flag=4
请问输出的flag的值为什么不是4,3,2,1,0呢?
发表于 2005-1-10 09:19:03 | 显示全部楼层
创建新进程的时候进程的存储空间被完全复制了,每个进程中的flag都是各自独立的,并不是同一个变量。这也是进程和线程最重要的区别之一。
发表于 2005-1-10 10:42:31 | 显示全部楼层
楼主把每个flag的地址打印出来就能看到差别了。
发表于 2005-1-10 12:10:21 | 显示全部楼层
呵呵,地址也是一样的。
 楼主| 发表于 2005-1-10 16:39:31 | 显示全部楼层
大家的意思也就是说子进程仅仅可以共享父进程的变量,但不能改变父进程的变量指。是吗?
那如果我要用fork实现子进程中改变父进程的值,应当怎么做?
请大家指点。
发表于 2005-1-10 16:44:42 | 显示全部楼层
Post by xxbview
大家的意思也就是说子进程仅仅可以共享父进程的变量,但不能改变父进程的变量指。是吗?
那如果我要用fork实现子进程中改变父进程的值,应当怎么做?
请大家指点。

这要用到进程接通信了
 楼主| 发表于 2005-1-10 17:19:05 | 显示全部楼层
我是在程序开头定义全局变量static int receives=0;
在main里:
fork(i=0;i<5;i++)
if((pid=fork())==0){
fork_do();
exit(0);
}
}
fork后在fork_do子进程里socket(),connect(),n=recv(),receives+=n;
最后在main里头输出一共recv了多少数据。
结果receives输出是0。所以我想问问怎样才能在main里统计到一共recv了多少数据?
发表于 2005-1-10 17:48:17 | 显示全部楼层
Post by xxbview
大家的意思也就是说子进程仅仅可以共享父进程的变量,但不能改变父进程的变量指。是吗?
那如果我要用fork实现子进程中改变父进程的值,应当怎么做?
请大家指点。


子进程不能共享父进程的变量,刚fork的时候,子进程完全拷贝父进程的存储空间,都有一个独立recieves变量在自己的存储空间里
发表于 2005-1-11 09:20:00 | 显示全部楼层
Post by xxbview
大家的意思也就是说子进程仅仅可以共享父进程的变量,但不能改变父进程的变量指。是吗?
那如果我要用fork实现子进程中改变父进程的值,应当怎么做?
请大家指点。

子进程不能共享父进程的变量,只是复制了一份。所以在各个子进程里修改某个变量,其值只在进程内部有变化,不会影响到其他进程。虽然地址一样,但是进程运行时是虚拟地址,而实际在物理上应该存储在不同的空间中。
发表于 2005-1-11 19:08:50 | 显示全部楼层
Post by doubleelec
呵呵,地址也是一样的。

sorry!忘记了每个进程的中静态变量的虚拟地址在连接时就确实了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表