在我的家庭作业中,我应该用下面的代码解释发生了什么:
#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=%dn", ++x);// add then print
}
printf("printf2: x=%dn", --x);
exit(0);
}
它非常简单易懂。大多数情况下,我得到以下输出:
printf2: x=0
printf1: x=2
printf2: x=1
这意味着父进程在子进程之前完成,子进程成为僵尸进程。 但有时我会得到以下输出:
printf1: x=2
printf2: x=1
打印后程序冻结(它不打印任何内容,也不会停止(。 我正在 Ubuntu 上运行该程序。 任何解释将不胜感激。
你有 3 个进程写入你的终端:父进程、子进程和 shell 解释器。父进程和 shell 具有"同步"输出,但子进程可以将其输出与其中任何一个交错。您可能认为是一个挂起的过程,实际上可能只是损坏的输出。
当您认为它已挂起时,您可以尝试输入命令并按回车键...