【发布时间】:2021-02-10 11:47:54
【问题描述】:
不太明白下面C++程序的输出。
#include <iostream>
#include <sys/types.h>
void foo(int *p) {
std::cout << p << std::endl;
(*p) ++;
}
int main() {
int i = 100;
if (fork() == 0) {
foo(&i);
std::cout << i << std::endl;
} else {
foo(&i);
std::cout << i << std::endl;
}
}
样本输出可能是
0x10f273070
101
0x10f273070
101
为什么地址相同,输出都是101?我希望一个进程输出 101,另一个输出 102。
【问题讨论】:
-
一个进程中的地址与另一个进程中的地址不同。它们仅在过程的上下文中有效。操作系统和 CPU 在内部将这些值映射到实际物理地址(使用进程上下文中的表)。此外,如果你 fork 一个进程,物理内存中的变量地址不会改变,除非你改变它们的值,此时会发生写时复制,并且从现在开始,一个 fork 进程中的变量物理地址将有所不同。
-
谢谢!但有一件事是 fork 似乎创建了一个子进程并运行自身下面的代码。我可以理解您的意思,地址映射到两个进程的不同物理地址。但是它们怎么都具有 100 的值呢?他们将值从父进程使用的物理地址复制到子进程?
-
分叉进程的物理内存是父进程的确切物理内存。没有复制。除非子级或父级更改值,此时,变量将被复制到新的物理内存位置,并且更改适用于这个新位置。
标签: c++ multiprocessing fork