儿童和儿童的反作用增加父与叉()

时间:2013-07-02 11:21:39

标签: c linux fork

我对这个小程序有疑问:

    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;
}

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

谢谢大家

5 个答案:

答案 0 :(得分:6)

那是因为在fork之后,父进程和子进程是不同的进程,并且每个进程都有自己的变量count

答案 1 :(得分:4)

因为父母和孩子没有在同一个过程中运行。

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

当您执行fork时,它将创建一个新的子进程。 New Child进程拥有自己的内存,堆栈,本地/全局变量空间。

两个进程从fork调用的同一点开始执行,但具有不同的内存空间。因此,一个进程的内存更改不会反映在其他进程中。

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

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

答案 4 :(得分: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;
}