题目来源于疼讯二面,题目大意是这样的:

进程A有两个子进程,A1和A2。在A1中发生了除0的错误。

进程B有两个子线程,B1和B2。在B1中也发生了除0的错误。

问发生错误以后会如何影响,他们的父进程是否还能运行?

问了几个同学也都不知道,干脆动手做一做!实践出真知。写两个测试程序,在Linux下运行看看结果。第一个程序是进程A:

利用fork函数产生两个子进程。由于不知道如何区分两个子进程,想出了上面的方法区分父进程和两个子进程,父进程为0,两个子进程为1、2。每一个进程都是执行10次循环,每次循环输出自己的信息、休眠1秒。在进程1中,当循环到i==4的时候发生了除0错误。

运行程序发现,当进程1出问题die了以后就不再循环,而他的父进程和另外两个进程依然在运行,可以得出结论,这种情况下子进程的严重错误不会影响父进程。

进一步探究下,如果父进程发生错误呢?通过修改上面的程序(代码就不再贴了),当父进程出错退出以后,两个子进程依然在执行。结合搜索的知识了解到,这个父进程退出,子进程由init进程(进程号1)来接管,它们则成为了孤儿进程继续执行i,并由init进程来完成状态收集工作。(更多关于孤儿进程和僵尸进程

继续我们最初的问题,再写一个测试程序,测试两个线程的情况:

本程序中使用POSIX线程接口创建线程。线程创建后等待线程结束。主线程和两个子线程中做的工作和之前的程序中一样,也是循环10次,在线程1中循环到4的时候发生了除0的错误。

运行发现,当线程1出错退出以后,循环全部停止,我猜测过程可能是这样的:线程1出错,导致主线程出错(没有出错信息)退出,由于主线程出错退出,他的另一个线程也停止。那么结论就是这种情况下,一个子线程严重错误会牵连整个进程。

由此这个问题得到解答。可能其中的原理还不是很明白,所以还是要好好学习操作系统啊……