我正在尝试理解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;
}
有人可以解释为什么我的假设不正确吗?
答案 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完成的地址空间,以避免分配永不改变的内存。