| mygod 回复于:2001-11-15 15:56:31
|
子进程会复制父进程的上下文,自然也包括全局变量,但不会影响父进程,因为请注意复制这个词!
|
| mygod 回复于:2001-11-16 08:49:26
|
补充一下,在派生子进程时要注意指针变量的使用,因为子进程虽然会产生另外一个指针变量,但它和父进程的指针的值是相同的,因此在子进程里面改变指针指向的内容,就可能影响父进程!
|
| nico 回复于:2001-12-16 13:36:35
|
如果变量申明时加上了static,那么在程序运行中变量的值是会改变的。
|
| lchsh 回复于:2001-12-26 15:59:10
|
不同意楼上的观点!! 同意mygod的.
|
| axchen 回复于:2001-12-27 11:22:12
|
不同意mygod的观点。子进程会产生另外一个指针变量,虽然但它和父进程的指针的值是相同的,在子进程里面改变指针指向的内容,不会影响父进程。因为指针寻址还会加上进程首地址作偏移量。
实践是检验真理的唯一标准。
|
| lchsh 回复于:2001-12-27 12:37:59
|
楼上的同志说的正确。
|
| mygod 回复于:2001-12-27 14:29:45
|
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 14:50:34
|
[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 16:31:59
|
同意楼上的看法,是的不同进程运行在各自的内存空间中,每个进程都有他独立的内存空间,由操作系统管理,各进程空间是不互相覆盖的,每个进程空间的起始地址都是0。所谓进程空间是操作系统为每个进程分配一个物理地址,进程中的地址只是一个相对地址而已,并不是真正的指向物理地址,代码和变量的实际地址由操作系统和硬件来转换:、 绝对地址=进程空间起始地址 + 相对地址
|
| jerryesquire 回复于:2002-10-23 18:09:18
|
sure
|
| galford 回复于:2002-10-23 18:49:31
|
废话,如果那么容易修改还用IPC干妈。
|
| flw 回复于:2002-10-24 16:47:22
|
同意楼上的观点!我们不要把简单的问题搞复杂了。另外一个问题换一个角度考虑实在是变的简单!
|
| 离了水的蛤蟆 回复于:2002-10-25 08:04:23
|
同意axchen,另外补充一点,IPC的入口是可以复制的,如果指针指向shared memory,父子进程就相互影响了。
|
| JohnBull 回复于:2002-10-25 18:22:41
|
[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 16:50:36
|
都是高手啊,佩服佩服!
|
| dongdongwx 回复于:2002-10-29 12:16:53
|
好,顶 让更多的人学学习习
|
| xh780927 回复于:2002-11-25 16:23:33
|
拜托能不能不要搞这么复杂啊,我只是想知道 我如何在子线程里修改这个全局变量的值,最简单的方法就可以了,请哪位大侠在百忙之中回答俺一下
|
| JohnBull 回复于:2002-11-25 18:49:27
|
[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.)
|
| dongfangyu 回复于:2003-04-15 14:23:46
|
同意JohnBull的说法。线程变量不会复制
|