当前位置:   article > 正文

fork函数结果分析_fork()==0

fork()==0

fork()函数结果分析

计算机系统基础-fork()
fork函数
运行结果
结果分析

以进程图为主,对结果进行分析。

fork0
在这里插入图片描述
调用fork(),创建子进程,fork() == 0时,即fork()返回值为0,子进程输出Hello from child;
fork()返回值不为0,父进程输出Hello from parent。
父子进程并发执行,输出的顺序不固定,输出序列对应进程图的拓扑顺序。

fork1

在这里插入图片描述

x=1,调用fork(),创建子进程,
fork() == 0时,即fork()返回值为0,子进程获得父进程代码、数据段、堆、栈等资源的副本。x++,故x = 2,输出pid和x;
fork()返回值不为0,父进程中,子进程对x的运算是独立的,x–,故x=0。

fork2
在这里插入图片描述

fork3
在这里插入图片描述
fork4
在这里插入图片描述
fork5
进程图与fork4类似

fork6
在这里插入图片描述
atexit()在函数终止时被调用,故在fork()后执行,父进程和子进程都会输出Cleaning up语句

fork7
在这里插入图片描述
子进程输出语句结束,父进程输出语句后一直进行while循环。Shell命令不会执行,需要手动挂起或中断父进程。

$ ./fork 7

在这里插入图片描述

用ps命令查看系统中执行的程序
在这里插入图片描述

可以看到子进程的状态码为Z,处于僵死状态,因为父进程一直没有回收它,它将一直占用内存。
尝试用kill命令杀死僵死的子进程
在这里插入图片描述
可以看到,kill子进程无效。为什么?
僵尸进程要等到父进程结束,或者重启系统才可以被释放。fork 7 中父进程被挂起(CTRL+Z),处于停止状态,但一直没有结束。该子进程是僵尸进程,此时进程已经释放所有的资源,但是没有被父进程释放,因此kill子进程无效。

发送信号9(SIGKILL)给父进程,将挂起的父进程杀死

$ kill -9 23541

在这里插入图片描述
可以看到,父进程被杀死后,子进程也被杀死了。

fork8
在这里插入图片描述
子进程输出语句后一直进行while循环,父进程输出语句后结束。与fork7不同的是,虽然子进程一直在执行,但Shell命令会在父进程结束后执行。
在这里插入图片描述
可以看到子进程一直处于运行状态。

fork9
在这里插入图片描述
wait(&child_status)父进程需等待子进程结束后才继续能执行,CT语句一定在最后输出。

fork10
exit(100+i);子进程的退出码分别为100、101、102、104、105,waitpid(pid[i], &child_status, 0);获取子进程结束的状态值,某一子进程结束后输出其PID和退出码。
(fork11与其类似)

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号