我对fork()
感到困惑。例如,以下代码的输出是什么?
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int value = 5;
int main() {
pid_t pid;
pid = fork();
if (pid == 0) { value += 15; return 0; }
else if (pid > 0>) { wait (NULL); printf (“Value = %d”, value); return 0}
}
答案 0 :(得分:3)
函数fork()
创建一个新进程,它是原始进程的完整副本。新进程有自己的内存和自己的所有变量副本。
在新的子进程中,返回的pid
值为零。孩子将变量value
加15并退出行:
if (pid == 0) { value += 15; return 0; }
value
在原始流程中为5。原始父进程的pid
大于零,它将转到:
else if (pid > 0) { wait (NULL); printf("Value = %d", value); return 0; }
此行打印:Value = 5
答案 1 :(得分:1)
输出为“Value = 5”。
fork函数将创建一个具有自己地址空间的新进程(子进程)。子进程将收到父进程数据区域,堆和堆栈的副本。因此,修改子进程中的变量value
不会影响父进程中的变量value
。
答案 2 :(得分:1)
可能你不知道或不太明白fork
的作用。就像Orest Hera和reffox都说的那样,fork()
跨越了一个新的过程。
您还应该知道父进程(实际调用fork
)将从pid
得到子进程的fork
。
子进程从fork
完成的点开始,然后返回0,从而使进程有机会检查,它们是谁:
var x = 7;
pid = fork();
if(pid < 0)
{
perror("failing to create a child process");
return SOME_ERROR;
}
if(pid == 0)
{
/* I'm the child process */
x = 9;
/* only I see that, my dad doesn't even notice that this happened */
...
} else {
/* I'm the parent process */
...
/* waiting for my child to die,
otherwise a zombie will be created,
and I DO mean a zombie */
wait(0);
/* the child is gone, now I can do whatever I want to */
}