1

我对这个小程序有疑问:

    int main() {

  pid_t process;
  int count= 0;

  switch(process= fork()) {

    case -1:
      printf("Fork error!\n\n");
      exit(1);
    break;

    case 0: //child
      printf("Process CHILD: PID= %d, Value= %d \n", getpid(), process);
      printf("Coounter NOT increased: %d\n", count);
      printf("Increase counter...\n");
      sleep(2);
      count= count + 2;
      printf("Counter increased: %d\n\n", count);
      exit(0);
    break;

    default: //parent
      wait(0);
      printf("Process PARENT: PID= %d, Value= %d\n", getpid(), process);
      printf("Counter value: %d\n\n", count);
    break;
  }
  return 0;
}

我增加了孩子的计数器,但在父母的计数器没有增加......为什么?

谢谢大家

4

5 回答 5

6

那是因为 after fork,父进程和子进程是不同的进程,并且他们每个人都有自己的变量副本count

于 2013-07-02T11:24:24.783 回答
4

因为父母和孩子不在同一个进程中运行。

每个进程中用于变量的内存是不同的。顺便说一下,这是流程的重点。

如果您真的想对进程执行此操作,请查看“共享内存”,如果您只想在单个进程的内存中进行多处理,请查看线程。

于 2013-07-02T11:23:56.960 回答
3

因为当你 fork 时,进程映像会被复制。与线程不同,一个进程修改全局变量不会影响另一个进程。这实际上是在许多情况下使用多个进程的好处之一。实际上,写时复制可以用来消除实际的复制,但是当您增加子项中的计数器时,必须进行复制,以免父项看到它。

于 2013-07-02T11:25:50.257 回答
2

当您执行分叉时,它将创建一个新的子进程。新子进程拥有自己的内存、堆栈、局部/全局变量空间。

两个进程都从调用 fork 的同一点开始执行,但内存空间不同。所以一个进程的内存变化不会反映在其他进程中。

如果您想在两个进程之间使用相同的内存,您可以使用共享内存。

另一种方法是您可以将变量值从子进程重定向到标准输出流并从父进程读取它。

于 2013-07-02T11:27:58.223 回答
0
#include <stdio.h>
#include <stdlib.h>

int count= 0;

int main() {

  pid_t process;


  switch(process= fork()) {

    case -1:
      printf("Fork error!\n\n");
      exit(1);
    break;

    case 0: //child
      printf("Process CHILD: PID= %d, Value= %d \n", getpid(), process);
      printf("Coounter NOT increased: %d\n", count);
      printf("Increase counter...\n");
      sleep(2);
      count= count + 2;
      printf("Counter increased: %d\n\n", count);
      exit(0);
    break;

    default: //parent
      wait(0);
      printf("Process PARENT: PID= %d, Value= %d\n", getpid(), process);
      printf("Counter value: %d\n\n", count);
    break;
  }
  return 0;
}
于 2016-03-14T07:38:28.297 回答