1

创建了两个进程。

他们每个人都使用输入 0 调用函数A(函数 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)
4

5 回答 5

4

您在进程和可执行文件之间感到困惑。

每个进程都是一个不同的实体,可以将二进制可执行指令和来自一个或多个文件的数据映射到其内存中。

即使是同一个可执行文件的 2 个实例(进程)也将拥有自己的所有变量的单独副本。即变量不共享。

进程之间的通信和共享数据是通过各种 IPC 机制实现的,详细信息请参见beej 撰写的关于 unix 系统的优秀 IPC 指南

于 2013-08-07T04:30:13.147 回答
2

任何健全的操作系统都会完全分离进程,因此默认情况下一个进程无法访问其他进程的内存。如果您需要更多说明,请询问。

澄清 - 全局变量共享。

于 2013-08-07T04:26:01.037 回答
1

对于每个过程。他们有自己的堆栈内存。数据段中存储的静态值。当然属于进程私有。

于 2013-08-07T04:31:36.820 回答
1

每当产生一个进程时,它都会获得自己的地址空间。地址空间包括数据段、堆栈段、堆/bss 和代码段。在您的程序中,变量 x 是全局变量,因此它在该进程的数据段中分配了内存。

2 或 100 个进程将在其数据段中拥有自己的 x 副本。这就是任何操作系统为正在运行的进程分配内存的方式。

如果您需要在进程之间共享变量“x”,那么您至少需要使用共享内存。

于 2013-08-07T04:31:43.993 回答
0

如果您在 main 中创建了两个线程,并且您调用了方法 A(),则可能会发生以下情况

  1. 两个线程执行 A() 方法的顺序是不确定的(任何线程都可以先启动)。

  2. 假设如果 thread1 执行 A() 方法直到 X++,并且如果 thread2 开始执行 A() 那么 thread2 将看到 x 值为 1 而不是零(因为它是一个全局变量)

  3. 如果有任何全局变量(在这种情况下为 x,z),则两个线程共享相同的全局值。

于 2013-08-07T06:17:36.530 回答