Advertisement

linux:关于fork()的例题

阅读量:

下面这段代码输出几个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()的时候,子进程将会拷贝父进程的缓冲区。所以执行过程如下图所示:

全部评论 (0)

还没有任何评论哟~