当前位置: 技术问答>linux和unix
子进程如何操作父进程中的变量
来源: 互联网 发布时间:2016-04-20
本文导语: #include #include //我想在子进程中对父进程中的m变量++,我知道子进程中有一个父进程的拷贝 //不能直接++,所以用了指针,子进程的指针n是父进程n的一个拷贝所以它也 //应该指向父进程中的m,按理说应该能改变父...
#include
#include
//我想在子进程中对父进程中的m变量++,我知道子进程中有一个父进程的拷贝
//不能直接++,所以用了指针,子进程的指针n是父进程n的一个拷贝所以它也
//应该指向父进程中的m,按理说应该能改变父进程中的m,为什么不行呢?
//那位高人给我一点指点
int main(){
pid_t pid;
int m=0;
int * n=&m;
pid=fork();
if(pid==0)
{
(*n)++;
printf("############## %d i am childn",n);
printf("############## %d i am childn",*n);
}
else if(pid>0)
{
printf("############## %d i am parentn",n);
sleep(1);
printf("############## %dn",*n);
}
return 0;
}
/*程序的运行结果是:
############## -4195992 i am parent
############## -4195992 i am child
############## 1 i am child
############## 0
#include
//我想在子进程中对父进程中的m变量++,我知道子进程中有一个父进程的拷贝
//不能直接++,所以用了指针,子进程的指针n是父进程n的一个拷贝所以它也
//应该指向父进程中的m,按理说应该能改变父进程中的m,为什么不行呢?
//那位高人给我一点指点
int main(){
pid_t pid;
int m=0;
int * n=&m;
pid=fork();
if(pid==0)
{
(*n)++;
printf("############## %d i am childn",n);
printf("############## %d i am childn",*n);
}
else if(pid>0)
{
printf("############## %d i am parentn",n);
sleep(1);
printf("############## %dn",*n);
}
return 0;
}
/*程序的运行结果是:
############## -4195992 i am parent
############## -4195992 i am child
############## 1 i am child
############## 0
|
首先子进程和父进程,不共享进程空间,子进程不能够访问父进程的变量,可以这样说,
在执行fork之后,他们是不相关的两个进程。
至于为什么以地址形式,来访问为什么也没有变化,
这是因为这两个进程不共享进程空间,在linux中每个进程有4G的地址。
即子进程的 &m 尽管和父进程的相同,但他们在物理内存中位置不同。
至于父进程和子进程的&m ,为什么相同,这是因为fork时,直接拷贝的原因,
在具体怎么实现的可以看一下fork的源码,也不长。
在执行fork之后,他们是不相关的两个进程。
至于为什么以地址形式,来访问为什么也没有变化,
这是因为这两个进程不共享进程空间,在linux中每个进程有4G的地址。
即子进程的 &m 尽管和父进程的相同,但他们在物理内存中位置不同。
至于父进程和子进程的&m ,为什么相同,这是因为fork时,直接拷贝的原因,
在具体怎么实现的可以看一下fork的源码,也不长。
|
我想是因为 写时复制 的机制的原因吧,开始应该是共享内存的,如果只是读他的值也是共享的,但是如果涉及到改变变量值的时候,就会另外复制给子进程一份拷贝
|
Unix操作系统的进程有自己的地址空间. 进程空间是独立的.
要改变父进程的变量,只有用进程间通信(IPC)才能实现. 比如:共享内存
要改变父进程的变量,只有用进程间通信(IPC)才能实现. 比如:共享内存