C 与fork()共享的变量

C 与fork()共享的变量,c,process,fork,C,Process,Fork,我有密码: int a = 0; if (fork() == 0) { a = a + 1; printf("%d \n", a); } else { a = a - 1; printf("%d \n", a); } 我想知道这段代码是否总是为2个打印输出不同的值 或者,如果在子进程加1之后有上下文切换,那么父进程将减1。在这种情况下,我们将得到相同的值。问题是,我不确定变量“a”是重复的,每个进程都有不同的副本(然后我们总是会得到不同的值),还是共享的(然后

我有密码:

int a = 0;

if (fork() == 0) {
    a = a + 1;
    printf("%d \n", a);
} else {
    a = a - 1;
    printf("%d \n", a);
}
我想知道这段代码是否总是为2个打印输出不同的值

或者,如果在子进程加1之后有上下文切换,那么父进程将减1。在这种情况下,我们将得到相同的值。问题是,我不确定变量“a”是重复的,每个进程都有不同的副本(然后我们总是会得到不同的值),还是共享的(然后我提到的情况会导致相同的值被打印两次)


非常感谢

分叉子级不与其父级共享其地址空间。它得到一个拷贝,尽管作为一种优化,该拷贝可能是一个懒惰的、写时拷贝的拷贝,这就是Linux所做的

在Linux上,分叉子进程最初将与其父进程共享其地址空间,但如果它尝试在任何地方写入,则(如果写入尝试不是分段错误),Linux将重定向该写入到原始页面的副本。

分叉()通过复制调用进程来创建子进程。 调用
fork()
的进程是父进程,新创建的进程是子进程。子进程和父进程在单独的内存空间中运行。但是在
fork()
时,两个内存空间具有相同的内容

有一种称为“写时复制”的概念,它是一种优化,其中设置页表,以便父进程和子进程开始共享所有相同的内存,并且在需要时只复制由任一进程写入的页。这意味着父进程和子进程都共享同一数据的副本,只要其中一个进程进行写入,就会创建一个副本,并且一个进程内存中的任何更改在另一个进程中都不可见

在您的计划中-
是的,父进程和子进程共享变量
a
的一个副本,直到其中一个进程写入变量,然后创建一个副本。任何一个进程(父进程/子进程)对变量
a
的值所做的任何更改都将在其自己的
a
副本中,并且该更改对另一个进程不可见

选中此项-。

它不是“共享”的。两个进程在
fork
之后将有两个不同的副本。没有“上下文切换”会改变行为。