fork如何在这个程序上运行?

时间:2014-02-24 05:06:09

标签: c process malloc fork

我有这个程序

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int x =1;
    int* y = malloc(sizeof(int));
    *y = 2;

    if (fork()==0)
        x++;

    if (fork()==0)
        (*y)++;

    printf("%d", (x+*y));
}

这是输出3445.这是我所知道的,fork()创建了一个新的子进程。如果是子进程,则fork()返回0;如果是父进程,则返回PID。所以一旦你调用fork(),它就变成了父和fork()== 0只在子进程而不是父进程上才为真。任何人都可以让我更深入地了解实际发生的事情,以便获得输出吗?

2 个答案:

答案 0 :(得分:2)

绘制图表显示子父母关系,他们的统计数据有所不同,这里有一种可能的形式(儿童为C,父母为P):

fork()
  C (x == 2, *y == 2)
  fork()
    C (x == 2, *y == 3) ==> print 5
    P (x == 2, *y == 2) ==> print 4
  P (x == 1, *y == 2)
  fork()
    C (x == 1, *y == 3) ==> print 4
    P (x == 1, *y == 2) ==> print 3

因此,将打印5,3,4,4的组合,确切的组合取决于这些printf()被调用的顺序,可能与运行不同

答案 1 :(得分:0)

fork()在出错时返回-1,因此您也必须检查它。 所以最好做一些像:

int pid;

pid = fork();

if (pid == 0)
{
    //child process code goes here
}
if (pid > 0)
{
    //parent process code goes here
}

请注意,在第一个fork()之后的两个进程再次执行fork(),因此最终会有4个进程。

当然,它们的执行顺序是未定义的,因此每次运行时,您将获得3个,5个和4个不同的组合。

另外,请注意,如果不在fork()之前调用flush(...),某些printf(...)和fork()组合会导致奇怪的输出。

最后,你忘了在最后释放(y),所以每次运行这个程序时都会泄漏4 * sizeof(int)字节。