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

问题描述 投票:0回答:1

在我的作业中,我应该解释以下代码中发生了什么。

#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上运行该程序。任何解释将被感激。

c fork
1个回答
3
投票

你有3个进程向你的终端写东西:父进程,子进程和shell解释器。父进程和shell有 "同步 "的输出,但子进程可能会与其中任何一个进程交错输出。你可能认为是一个挂起的进程,实际上可能只是杂乱的输出。

当你认为它已经挂起时,你可以试着输入一个命令,然后按回车键......

© www.soinside.com 2019 - 2024. All rights reserved.