第一题:
//fork1.c #include <unistd.h> #include <stdio.h> int main(void) { int i = 0; for(i = 0; i < 3; i++) { pid_t fpid = fork(); if(fpid == 0) { printf("son\n"); break; } else { printf("father\n"); } } sleep(10); return 0; } //fork2.c #include <unistd.h> #include <stdio.h> int main(void) { int i = 0; for(i = 0; i < 3; i++){ pid_t fpid = fork(); if(fpid == 0) { printf("son\n"); //break; 差别 } else { printf("father\n"); } } sleep(10); return 0; } [root@localhost mytest]# gcc fork1.c -o fork1 [root@localhost mytest]# ./fork1 father son son father father son [root@localhost ~]# pstree -p | grep fork1 |-sshd(1362)-+-sshd(16678)---bash(16722)---fork1(18697)-+-fork1(18698) | | |-fork1(18699) | | `-fork1(18700) [root@localhost mytest]# ./fork2 father son father father father son father son father son son son father son [root@localhost mytest]# pstree -p | grep fork2 |-sshd(1362)-+-sshd(16678)---bash(16722)---fork2(19092)-+-fork2(19093)-+-fork2(19095)---fork2(19099) | | | `-fork2(19097) | | |-fork2(19094)---fork2(19098) | | `-fork2(19096) [root@localhost mytest]#
第二题:
#include <unistd.h> #include <stdio.h> int main(void) { pid_t pid1; pid_t pid2; pid1 = fork(); pid2 = fork(); printf("pid1=%d pid2=%d\n", pid1, pid2); sleep(10); return 0; } [root@localhost mytest]# ./fork3 pid1=22874 pid2=22875 pid1=0 pid2=22876 pid1=22874 pid2=0 pid1=0 pid2=0 [root@localhost mytest]# pstree -p | grep fork3 |-sshd(1362)-+-sshd(16678)---bash(16722)---fork3(22824)-+-fork3(22825)---fork3(22827) | | `-fork3(22826)
用树状图表示更清晰些:
第三题:
#include <unistd.h> #include <stdio.h> int main(void) { fork() && fork() || fork(); return 0; }
这个题考察了两个知识点:逻辑运算符特点与fork()理解。
假如有表达式cond1 && cond2 || cond3,会怎样执行呢?
A、如果cond1为false,就不用判断cond2,而是直接判断cond3;
B、如果cond1为true,那么:
a、如果cond2为true,就不会判断cond3;
b、如果cond2为false,还需要判断cond3。
这样进程关系图如下:
这样,本程序创建了4个新进程,总共有5个进程(5个叶子节点)。
类似地,把代码改成fork() || fork() && fork(),那么程序会创建5个进程(5个叶子节点)。
第四题:
#include <unistd.h> #include <stdio.h> int main(void) { fork(); fork() && fork() || fork(); fork(); return 0;
第一行: 共2个进程;
第二行:共2*5=10个进程;
第三行:共2*10=20个进程。
这样,本程序总共有20个进程,其中创建了20-1=19个新进程。