创建了两个进程。
每个调用函数A
并输入0(函数A在其他.c文件中)。
变量x必须是全局的,但是,每个进程都应该是私有的。
由于它是x = y
,似乎每个进程都有自己的x。我想知道为什么?为什么z在两个流程之间共享?
int x;
int z;
void A(int y)
{
x = y;
x++;
z++;
B();
}
void B()
{
x--;
}
在main.c中
//2 process created and each of them call A(0)
答案 0 :(得分:4)
您在进程和可执行文件之间感到困惑。
每个进程都是一个独特的实体,可以将二进制可执行指令和一个或多个文件中的数据映射到其内存中。
即使是同一个可执行文件的2个实例(进程)也将拥有所有变量的各自副本。即不共享变量。
通过各种IPC机制实现流程之间的通信和共享数据,详见 excellent IPC guide on unix systems by beej 。
答案 1 :(得分:2)
任何理智的操作系统都会完全分离进程,因此默认情况下,一个进程无法访问其他进程。过程记忆。如果您需要更多说明,请随时提出。
澄清 - 全局变量不共享。
答案 2 :(得分:1)
对于每个过程。他们有自己的堆栈内存。存储在数据段中的静态值。当然属于进程私有。
答案 3 :(得分:1)
每当生成一个进程时,它就会获得自己的地址空间。地址空间包括数据段,堆栈段,堆/ bss和代码段。 在您的程序中,变量x是全局变量,因此在该进程的数据段中分配内存。
2个或100个进程在其数据段中将拥有自己的x副本。这是任何操作系统将内存分配给正在运行的进程的方式。
如果需要在进程之间共享变量“x”,则需要至少使用共享内存。
答案 4 :(得分:0)
如果您在main中创建了两个线程,并且调用了方法A(),则可能会发生以下情况
两个线程的A()方法的执行顺序是未定义的(任何线程都可以先启动)。
假设如果thread1执行A()方法直到X ++,并且如果thread2开始执行A(),那么thread2将看到x值为1而不是零(因为它是一个全局变量)
如果有任何全局变量(在本例中为x,z),则两个线程共享相同的全局值。