zoukankan      html  css  js  c++  java
  • 关于fork有意思的两道题目

    http://www.spongeliu.com/123.html

    第一题,计算下面代码理论上总共打印了多少行:(网易2011笔试题)

     
    #include
    #include
    #include
    int main(){
            int i;
            for(i = 0; i<5; i++){
                    fork();
                    printf("%d
    ",getpid());
                    fflush(stdout);
            }
    }

    这道问题并不难,最快的想法就是2+4+8+16+32,因为第一层的printf会有两个进程打印,第二层会增加到4个,以此往下,就得出62行。

    第二题:问下面的代码执行后总共产生了多少进程(不包括主进程)?(2009 EMC笔试)

    #include
    int main(){
            fork();
            fork() && fork() || fork();
            fork();
    }
    让我们仍然采用上题的算法,使用一个队列:
    
    首先,将主进程产生子进程的位置放到队列中:
    queue = " A B C E ";
    sum = 0;
    我们从队列中取首元素A,我们分析A处产生的进程,发现它会在B, C, E三处产生子进程,我们把这三个元素插入到队列中,并将sum+1。
    queue = " B C E B C E "
    sum ++;
    然后,我们从队列中取出首元素B,B处产生的子进程稍稍不一样,因为子进程中B所代表的fork()返回值为0,因此C得不到执行,而D会得到执行。因此,B处产生的子进程会执行D, E,将这两个元素送入队列,sum++:
    queue = " C E B C E D E "
    sum ++;
    下面,我们取首元素C,分析发现,C处产生的进程会执行D, E,送入队列并且sum++:
    queue = " E B C E D E D E "
    sum ++;
    同上一题一样,依次这样执行,遇到E则没有元素入队列,直到最后队列为空,sum就是总共产生的进程个数。
  • 相关阅读:
    Attributes in C#
    asp.net C# 时间格式大全
    UVA 10518 How Many Calls?
    UVA 10303 How Many Trees?
    UVA 991 Safe Salutations
    UVA 10862 Connect the Cable Wires
    UVA 10417 Gift Exchanging
    UVA 10229 Modular Fibonacci
    UVA 10079 Pizza Cutting
    UVA 10334 Ray Through Glasses
  • 原文地址:https://www.cnblogs.com/charlesblc/p/6265292.html
Copyright © 2011-2022 走看看