这个C代码做了什么?

时间:2010-09-16 20:14:10

标签: c++ c fork

我是C编程的新手,虽然我做了很多其他类型的编程。

我想知道是否有人可以向我解释为什么这个程序输出10。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>

int value = 10;

int main()
{
    pid_t pid;

    pid = fork();
    if(pid == 0){
    value += 10;
    }
    else if(pid > 0){
        wait(NULL);
        printf("parent: value = %d\n", value); //Line A
        exit(0);
    }
}

我知道输出是“parent:value = 10”。谁知道为什么?

谢谢!

6 个答案:

答案 0 :(得分:16)

fork创建两个进程(“父”和“子”)。在您的示例中,每个进程都有不同的pid值。子进程的pid为0.父进程有一个子操作系统pid的pid(由操作系统分配)。

在您的示例中,每个进程在其内存中都有自己的value。他们分享内存(就像你认为他们应该通过你的问题。)如果你改变一个过程(if的第一部分)它将不会反映在第二个过程中(第二部分)如果。)

编辑:解释了pid的价值。

答案 1 :(得分:4)

关于fork():

  • 如果fork()返回负值, 创建一个子进程是 不成功。
  • 如果fork()向新返回零 创建了子进程。
  • 如果fork()返回正值,则为 子进程的进程ID,以 父母。

所以在你的情况下,它必然会返回一个大于0和0的数字。因此价值将保持在10&amp;将被打印。

答案 2 :(得分:2)

好吧,fork会产生一个新进程。它或多或少地复制当前进程,新的(子)和旧的(父)在代码中的同一点继续。但是这里有一个显着的区别(我们感兴趣):对于孩子,fork返回0.对于父母,它返回孩子的进程ID。

所以if(pid ==0)部分适用于孩子。孩子简单地将10添加到他的 value,然后退出,因为没有其他代码。

else部分对于父项是正确的(除了fork以-1发回错误的极少数情况除外)。父母只需要wait s让孩子退出。但是孩子已经修改了自己的value副本,父母之一仍未受影响,这就是为什么你得到“10”的输出。然后父母也退出。

答案 3 :(得分:0)

fork()创建一个新进程:它在两个不同的上下文中有两个返回值,因此两个路径都在if语句中运行。条件主要用于确定在fork之后运行的进程。

答案 4 :(得分:0)

当您致电fork时,它会创建一个过程的副本,使副本“program counter在其代码部分中的位置相同。因此,当任何这些副本恢复执行时,两者都将完成对fork的调用。

所以他们两个都应该执行相同的。

但是,fork在子进程中返回0,在父进程中返回子进程的pid

这解释了if( pid==0 )部分背后的魔力。

因此,当子进程更改value的值时,它实际上会更改它自己的副本(请记住:进程已被复制,因此数据部分也被复制了。)

同时,父进程使用其旧值value执行,即10。

即使孩子更改了value的副本并且死亡,父母的副本仍然是10。

答案 5 :(得分:0)

fork系统调用创建一个新进程作为现有(父)进程的子进程。父语句和子语句都在fork语句后面的行继续执行,但子进程被给予父组地址空间的精确副本。

fork系统调用将新创建的进程的进程id返回给父进程,并将0返回给子进程,因此在此代码中,子进程将递增自己的value变量副本,并且父进程将打印出自己的副本。

您经常会在子项中看到fork后跟一个exec,以便它替换为另一个程序。