【问题标题】:C: private variable for processC:进程的私有变量
【发布时间】:2013-08-08 07:30:11
【问题描述】:

创建了两个进程。

他们每个人都使用输入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)

【问题讨论】:

  • 你是在 main 中创建两个线程吗?
  • 2个进程,是在main

标签: c process static mutex private


【解决方案1】:

您混淆了进程和可执行文件。

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

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

进程之间的通信和共享数据是通过各种 IPC 机制实现的,详见此 excellent IPC guide on unix systems by beej

【讨论】:

    【解决方案2】:

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

    澄清一下 - 全局变量共享。

    【讨论】:

    • 谢谢,但是如果存在全局变量,那么它将被共享。为什么?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

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

          李>
        3. 如果有任何全局变量(本例中为 x,z),则两个线程共享相同的全局值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-27
          • 2015-11-27
          • 2013-06-22
          • 2012-03-02
          • 2013-09-14
          • 2019-11-04
          • 2013-10-09
          • 1970-01-01
          相关资源
          最近更新 更多