ChinaUnix.net
 >> ChinaUnix.net > C/C++

[求助]关于全局变量

作者:sundragon     发表时间:2001/11/15 03:40pm

全局变量在子进程中是否一样被使用?
如果能被使用,其值的变化是否影响父进程?

此文章相关评论:
该文章有18个相关评论如下:(点这儿可以发表评论)
mygod 发表于: 2001/11/15 03:56pm
子进程会复制父进程的上下文,自然也包括全局变量,但不会影响父进程,因为请注意复制这个词!
 
mygod 发表于: 2001/11/16 08:49am
补充一下,在派生子进程时要注意指针变量的使用,因为子进程虽然会产生另外一个指针变量,但它和父进程的指针的值是相同的,因此在子进程里面改变指针指向的内容,就可能影响父进程!
 
nico 发表于: 2001/12/16 01:36pm
如果变量申明时加上了static,那么在程序运行中变量的值是会改变的。
 
lchsh 发表于: 2001/12/26 03:59pm
不同意楼上的观点!!
同意mygod的.
 
axchen 发表于: 2001/12/27 11:22am
不同意mygod的观点。子进程会产生另外一个指针变量,虽然但它和父进程的指针的值是相同的,在子进程里面改变指针指向的内容,不会影响父进程。因为指针寻址还会加上进程首地址作偏移量。

实践是检验真理的唯一标准。

 
lchsh 发表于: 2001/12/27 12:37pm
楼上的同志说的正确。
 
mygod 发表于: 2001/12/27 02:29pm
axchen说的是对的,谢谢!
我在AIX上作了一个小程序试了一下,程序代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

main()
{
  char* tmp;
  pid_t pid_tmp;

  tmp = malloc(40);
  strcpy(tmp,"parent");
  pid_tmp = fork();
  switch(pid_tmp)
  {
        case  -1 :
                 printf("!!!!!!fork err!!!!!!!!!!\n");
                 exit(1);
        case   0 :
                 strcpy(tmp,"child");
                 exit(0);
  }
  wait(&pid_tmp);
  printf("%s\n",tmp);
  exit(0);
}

运行结果如下:
parent

 
JohnBull 发表于: 2002/09/23 02:50pm
[quote][b]下面引用由[u]mygod[/u]在 [i]2001/12/27 02:29pm[/i] 发表的内容:[/b]
axchen说的是对的,谢谢!
我在AIX上作了一个小程序试了一下,程序代码如下:
#include <stdio.h>
#include <stdlib.h>
...
[/quote]

没人说对,参看任何关于“保护模式”的书。
进程使用的是线性地址,不同进程拥有不同的内存页表,虽然线性地址相同,物理地址却不相同。

 
fenglsh 发表于: 2002/10/23 04:31pm
同意楼上的看法,是的不同进程运行在各自的内存空间中,每个进程都有他独立的内存空间,由操作系统管理,各进程空间是不互相覆盖的,每个进程空间的起始地址都是0。所谓进程空间是操作系统为每个进程分配一个物理地址,进程中的地址只是一个相对地址而已,并不是真正的指向物理地址,代码和变量的实际地址由操作系统和硬件来转换:、
       绝对地址=进程空间起始地址 + 相对地址
 
jerryesquire 发表于: 2002/10/23 06:09pm
sure
 
galford 发表于: 2002/10/23 06:49pm
废话,如果那么容易修改还用IPC干妈。
 
flw 发表于: 2002/10/24 04:47pm
同意楼上的观点!我们不要把简单的问题搞复杂了。另外一个问题换一个角度考虑实在是变的简单!
 
离了水的蛤蟆 发表于: 2002/10/25 08:04am
同意axchen,另外补充一点,IPC的入口是可以复制的,如果指针指向shared memory,父子进程就相互影响了。
 
JohnBull 发表于: 2002/10/25 06:22pm
[quote][b]下面引用由[u]fenglsh[/u]在 [i]2002/10/23 04:31pm[/i] 发表的内容:[/b]
绝对地址=进程空间起始地址 + 相对地址
[/quote]

还是错!
至少在I386体系上根本不存在这样一种简单的加法关系。
请认真阅读任意一本关于“保护模式”的书,而不要主观臆断!

进程的线性地址到物理地址的映射关系是通过“页表”来完成的,也就是说进程的线性地址是由若干的(很可能是不连续的)物理内存页“拼”出来的。为了省内存,i386提供两级页表机制,而为了兼容性考虑,系统也可以自行设计(如Linux引入了三级页表)。页表的位置写在CPU的CR3寄存器中,每个进程有自己的页表,进程的CR3的值记在它的TSS中,实现进程切换。
……

进一步的细节请去看书。

 
ylfind 发表于: 2002/10/28 04:50pm
都是高手啊,佩服佩服!
 
dongdongwx 发表于: 2002/10/29 12:16pm
好,顶
让更多的人学学习习
 
xh780927 发表于: 2002/11/25 04:23pm
拜托能不能不要搞这么复杂啊,我只是想知道 我如何在子线程里修改这个全局变量的值,最简单的方法就可以了,请哪位大侠在百忙之中回答俺一下
 
JohnBull 发表于: 2002/11/25 06:49pm
[quote][b]下面引用由[u]xh780927[/u]在 [i]2002/11/25 04:23pm[/i] 发表的内容:[/b]
拜托能不能不要搞这么复杂啊,我只是想知道 我如何在子线程里修改这个全局变量的值,最简单的方法就可以了,请哪位大侠在百忙之中回答俺一下
[/quote]

Between Processes, there are no 简单的方法, you have to use SYSV IPC - share memory.

Between Threads, you may change the global var directly, other threads belong to the same process would see your change Immediatlly.(If more than one thread would have to write the same var, you have to do something for threads sync.)

 
 

Copyright © ChinaUnix.net  *  转载请注明出处及作者