使用fork()的C程序的奇怪行为

在我的作业中,我应该解释以下代码中发生的情况:

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

int main(){
    int x = 1; 
    if(fork() == 0){// child
        printf("printf1: x=%d\n", ++x);// add then print
    }
    printf("printf2: x=%d\n", --x);
    exit(0);  
}

这非常简单易懂。大多数时候,我得到以下输出:

printf2: x=0
printf1: x=2
printf2: x=1

这意味着父进程在孩子和僵尸进程之前完成。 但是有时候我得到以下输出:

printf1: x=2
printf2: x=1

打印后,程序冻结(它不打印任何内容并且不会停止)。 我在Ubuntu上运行该程序。 任何解释将不胜感激。