当前位置: 技术问答>linux和unix
进程共享变量的奇怪问题
来源: 互联网 发布时间:2015-12-28
本文导语: 我发现创建进程函数中共享变量的一个奇怪问题,如下: #include …… int main() { int *p, num = 1; p = # if( fork() == 0 ) { ++( *p ); printf( "child addr:%d", p ); printf( "nu...
我发现创建进程函数中共享变量的一个奇怪问题,如下:
#include
……
int main()
{
int *p, num = 1;
p = #
if( fork() == 0 )
{
++( *p );
printf( "child addr:%d", p );
printf( "num in child:%d", *p );
exit( 0 );
}
else
{
wait( NULL ); //等子进程执行完毕再执行父进程
++( *p );
printf( "father addr:%d", p );
printf( "num in father:%d", *p );
}
}
在父子进程中打印的指针变量p存储num的地址都是一样的,按理说在子进程中对*p对应的num值进行一次++后,在父进程再进行一次++,父进程中输出的应该是3才对呀,为什么两个进程输出的都是2,一个地址怎么可能存储两个数据。哪个高手指点一下。
#include
……
int main()
{
int *p, num = 1;
p = #
if( fork() == 0 )
{
++( *p );
printf( "child addr:%d", p );
printf( "num in child:%d", *p );
exit( 0 );
}
else
{
wait( NULL ); //等子进程执行完毕再执行父进程
++( *p );
printf( "father addr:%d", p );
printf( "num in father:%d", *p );
}
}
在父子进程中打印的指针变量p存储num的地址都是一样的,按理说在子进程中对*p对应的num值进行一次++后,在父进程再进行一次++,父进程中输出的应该是3才对呀,为什么两个进程输出的都是2,一个地址怎么可能存储两个数据。哪个高手指点一下。
|
子进程中对*p对应的num值进行一次++,子进程结束后,并不能改变父进程的*p的值,所以父进程还是原来的,用共享内存可以解决
应该是子进程拷贝的是父进程的虚拟地址空间,而他们的物理地址并不一样,所以,你修改子进程的*p的值是没有用的
应该是子进程拷贝的是父进程的虚拟地址空间,而他们的物理地址并不一样,所以,你修改子进程的*p的值是没有用的
|
fork出来之后,各个进程之间的资源是完全独立的,打印出来的地址其实也是进程内部的地址,只是值可能一样而已,其实没有关系。
你开两个telnet窗口到主机上,在一个窗口改了环境变量,另一窗口是体现不出来的, 和这个问题是一样的。
你开两个telnet窗口到主机上,在一个窗口改了环境变量,另一窗口是体现不出来的, 和这个问题是一样的。