fork()和更改局部变量?

时间:2016-05-20 12:46:15

标签: c process fork

我正在尝试理解fork()概念,这是我无法理解的一件事。

在下面的代码中 - 为什么即使子进程将其更改为5,父进程仍会打印i = 0?

等待(NULL)阻止父进程,直到子进程完成。

int main(int argc, char *argv[]) {
  int i = 0;
  if (fork() == 0) {
    i = 5;
  } else {
    wait(NULL);
    printf("i = %d\n", i);
  }
  return 0;
}

有人可以解释为什么我的假设不正确吗?

3 个答案:

答案 0 :(得分:5)

流程之间不共享变量。在调用fork之后,有两个完全独立的进程。 fork在子节点中返回0,其中局部变量设置为5.在父节点中,fork返回子节点的进程ID,i的值不会更改;它在调用fork之前仍然设置了值0。它的行为与您分别运行两个程序的行为相同:

int main(int args, char *argv[]) {
    int i=0;
    printf("i = %d\n", i);
    return 0;
}

int main(int argc, char *argv[]) {
  int i = 0;
  i = 5;
  return 0;
}

答案 1 :(得分:4)

进程不是线程!在fork时,创建一个完整的克隆进程,具有独立的内存分配,在fork 时只包含相同的值(fork调用的结果除外)

如果您希望子进程更新父进程中的某些数据,则需要使用线程。线程与其父线程共享所有静态和动态分配的内存,并且只具有独立的自动变量。但即使在那里,您也应该对#!/bin/bash dir='Location: ../http/index.html' #POST($dir) send(data)?? 变量使用静态分配:

i

答案 2 :(得分:1)

当您fork子进程获得父地址空间的地址空间副本时,他们不会共享它,所以当孩子改变i时,父母获胜并且#39}看到了。

复制通常使用copy on write完成的地址空间,以避免分配永不改变的内存。