例1: 以下代码的输出是什么?
#include <stdio.h> #include <unistd.h> int main() { if (fork() || fork()) fork(); printf ( "1 " ); return 0; } |
输出:
1 1 1 1 1
说明: 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
说明: 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
说明: 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)。