我是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”。谁知道为什么?
谢谢!
答案 0 :(得分:16)
fork
创建两个进程(“父”和“子”)。在您的示例中,每个进程都有不同的pid值。子进程的pid为0.父进程有一个子操作系统pid的pid(由操作系统分配)。
在您的示例中,每个进程在其内存中都有自己的value
。他们不分享内存(就像你认为他们应该通过你的问题。)如果你改变一个过程(if的第一部分)它将不会反映在第二个过程中(第二部分)如果。)
编辑:解释了pid的价值。
答案 1 :(得分:4)
关于fork():
所以在你的情况下,它必然会返回一个大于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,以便它替换为另一个程序。