赞
踩
计算机系统基础-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与其类似)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。