Fork()–练习问题

先决条件: 叉子的基础知识 , 叉树和二叉树 ,

null

例1: 以下代码的输出是什么?

#include <stdio.h>
#include <unistd.h>
int main()
{
if (fork() || fork())
fork();
printf ( "1 " );
return 0;
}


输出:

 1 1 1 1 1 

fork1

说明: 1.它将创建两个进程,一个是父进程P(具有子进程的进程ID),另一个是子进程C1(进程ID=0)。 2.在if语句中,我们使用了OR运算符(| |),在这种情况下,当第一个条件为false时,将计算第二个条件。 3.父进程P将返回正整数,因此它直接执行语句并创建另外两个进程(一个是父进程P,另一个是子进程C2)。子进程C1将返回0,因此它检查第二个条件,第二个条件再次创建两个以上的进程(一个是父进程C1,另一个是子进程C3)。 4.C1返回正整数,因此它将进一步创建另外两个进程(一个是父进程C1,另一个是子进程C4)。子C3返回0,因此它将直接打印1。

例2: 以下代码的输出是什么?

#include <stdio.h>
#include <unistd.h>
int main()
{
if (fork()) {
if (!fork()) {
fork();
printf ( "1 " );
}
else {
printf ( "2 " );
}
}
else {
printf ( "3 " );
}
printf ( "4 " );
return 0;
}


输出:

 2 4 1 4 1 4 3 4 

fork2 说明: 1.它将创建两个进程,一个是父进程P(具有子进程的进程ID),另一个是子进程C1(进程ID=0)。 2.当条件为true时,父级P执行if语句,子级C1执行else语句并打印3。父P检查下一个if语句并创建两个进程(一个父P和子C2)。在if语句中,我们使用的是not运算符(即,!),它为子进程C2执行,父进程P执行else part并打印值2。儿童C2 进一步创建两个新流程(一个是父C2,另一个是子C3)。

例3: 以下代码的输出是什么?

#include <stdio.h>
#include <unistd.h>
int main()
{
if (fork() && (!fork())) {
if (fork() || fork()) {
fork();
}
}
printf ( "2 " );
return 0;
}


输出:

 2 2 2 2 2 2 2 

fork3 说明: 1.Fork将创建两个进程,一个是父进程P(具有新子进程id),另一个是子进程C1(进程id=0)。 2.在if语句中,我们使用AND运算符(即,&&&),在这种情况下,如果第一个条件为false,则不会计算第二个条件并打印2。父进程P检查第二个条件并创建两个新进程(一个是父进程P,另一个是子进程C2)。在第二种情况下,我们使用NOT运算符,它为子进程C2返回true,并执行内部if语句。 3.子C2再次创建两个新进程(一个父C2和子C3),我们正在使用OR运算符(即| |),当第一个条件为false时,它会计算第二个条件。父C2执行if part并创建两个新流程(一个父C2和子C4),而子C3检查第二个条件并创建两个新流程(一个父C3和子C5)。 4.父C3进入if部分,并进一步创建两个新流程(一个父C3和子C6)。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享