linux:关于fork()的例题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40657299/article/details/78410388
下面这段代码输出几个a?

int main()
{
    fork()||fork();
    printf("a\n");
    exit(0);
}

答案是3个,下面我们来一起分析一下:
父子进程的pid是题目的关键,pid=0,ppid!=0.或(||)的关系下第一个fork()为真,就无需判断第二个,两个fork()均为0时,结束。所以这段代码可以输出三个a.


我们再来试一道题,加深一下我们对fork()的理解。
下面这段代码分别输出几个a?
int main()
{
    int i;
    for(i =0; i<2 ;i++)
    {
        fork();
        //printf("a");
        printf("a\n");
    }
    return 0;
}
我们先来一起分析一下有\n输出时:

所以最终输出的a为6个。
那么如果是printf("a")呢?会有什么不同

下面我们来分析一下:
这两个语句就差了一个“\n”,恰恰就是这个“\n”使执行结果发生了变化。因为在执行打印语句printf()时,它并不是立即将内容打印出来,而是放到了一个缓冲区中,在缓冲区满之后才会将缓冲区中的内容打印出来。而我们在所打印的内容之后加上“\n”之后就意味着告诉printf()函数马上将缓冲区中的内容打印出来。
所以在没加上“\n”的时候,每次执行printf的时候就会向缓冲区中加入一个“a”,每个进程都有一个属于自己的缓冲区,在fork()的时候,子进程将会拷贝父进程的缓冲区。所以执行过程如下图所示:
展开阅读全文

没有更多推荐了,返回首页