linux环境编程之 fork() || fork()

由一个面试题关联到的:
int main{
fork() || fork()
}
逻辑上一共创建了多少个进程(包括父进程)?

答案是三个!
分析如下:
你肯定想到了 || 的运算特性,前面的fork返回子进程号,不为0执行结束,万事大吉,所以结束了,一共创建了2个进程嘛!
但是fork对父子进程都会有返回值的,父进程返回子进程的PID,子进程返回0!
那么左边fork的子进程返回的是0也就造成了子进程的 || 还要计算后面的fork,所以子进程fork了一个进程。
所以一共三个。
但是我没运行出来,正常输出,然后就卡住了。不知道为什么。
linux环境编程之 fork() || fork()_第1张图片 linux环境编程之 fork() || fork()_第2张图片
然后将每个进程的PID打印出来看:
linux环境编程之 fork() || fork()_第3张图片 linux环境编程之 fork() || fork()_第4张图片
父进程PID是4840,执行之后退出,子进程PID应该是4841,孙子进程PID应该是4842.
按照上面的结果来看:父进程打印后就结束了,没有等待子进程,子进程创建了孙子进程,孙子进程先执行打印后结束,此时子进程才执行,执行后就等待了。

此时的子进程实际上成为了孤儿进程!而且我没有将这个孤儿过继给init,所以他就一直在那儿哭?
因为它的父进程已经退出了,那么加上wait语句试一下,让父进程等待所有的子进程(其中包含子进程等待孙子进程,本例中):
linux环境编程之 fork() || fork()_第5张图片 linux环境编程之 fork() || fork()_第6张图片
程序正常了。
也就是所有的父进程等待子进程结束后才退出。
下面把程序改一下,输出特定的信息,利于观察:
linux环境编程之 fork() || fork()_第7张图片
得到的结果是:
linux环境编程之 fork() || fork()_第8张图片
可以看到每个父进程只等待子进程结束,孙子进程因为没有子进程所以wait返回-1表示出错。
子进程返回孙子进程PID,父进程返回子进程PID。

如有错误,请一定指出。


你可能感兴趣的:(linux,面试题)