fork()进程如何工作(操作系统)

时间:2015-10-04 21:39:06

标签: c linux operating-system fork posix

我对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} 
} 

3 个答案:

答案 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 */

}