【问题标题】:fork() and changing local variables?fork() 和改变局部变量?
【发布时间】:2016-05-20 12:46:14
【问题描述】:

我正在尝试理解 fork() 概念,但有一件事我似乎无法理解。

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

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

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

【问题讨论】:

  • 你猜fork会做什么?

标签: c process fork


【解决方案1】:

变量不在进程之间共享。在调用fork 之后,有两个完全独立的进程。 fork在child中返回0,局部变量设置为5。在parent中,fork返回child的进程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;
}

【讨论】:

  • 因此,如果我希望 i=5 在父级执行时打印,如果不在父级中添加语句 i=5 ,我该怎么做呢?简而言之,有没有办法在孩子和父母之间共享变量?
  • 您需要使用一些 IPC(进程间通信)机制(文件、管道、套接字、共享内存……)将值传递给子进程或从子进程传出。
  • 您有一些类似的主题here。但是您必须阅读有关进程间通信 (IPC) 的内容。
【解决方案2】:

进程不是线程!当您分叉时,您会创建一个完整的克隆进程,其独立的内存分配只包含相同的值(除了分叉调用的结果)在分叉时

如果您希望子进程更新父进程中的某些数据,则需要使用线程。线程与其父线程共享所有静态和动态分配的内存,并且仅具有独立的自动变量。但即使在那里,您也应该对i 变量使用静态分配:

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

【讨论】:

    【解决方案3】:

    当你fork子进程获取父地址空间的地址空间副本时,他们不共享它,所以当子进程更改i时父进程不会看到它。

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

    【讨论】:

      猜你喜欢
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多