fork有关趣味题

第一题:

//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)

用树状图表示更清晰些:

fork有关趣味题_第1张图片fork有关趣味题_第2张图片

 

第三题:

#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。

这样进程关系图如下:

fork有关趣味题_第3张图片

 

   这样,本程序创建了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个新进程。

 

你可能感兴趣的:(fork有关趣味题)