zoukankan      html  css  js  c++  java
  • 一个fork的面试题

     1 int i;
     2 for(i=0; i<2; i++){
     3    fork();
     4    printf("-");
     5 }
     6 
     7 wait(NULL);
     8 wait(NULL);
     9 
    10 return 0;

    问上述程序会打印出多少个"-",我当时认为是6个啊,这还用问?嗨。原来fork调用的时候已经把printf中的"-"放在缓存区中了,而且没有flush,即没有刷新缓冲区。所以父子进程各复制了一份"-",所以答案是8个。

    下面这段代码:

     1 int main()
     2 {
     3     char buf[]="a write to stdout
    ";
     4     int var=88;
     5     int globvar=6;
     6     pid_t pid;
     7 
     8     if(write(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1) {
     9         return -1;
    10     }
    11     printf("before fork
    ");
    12 
    13     if((pid=fork())<0){
    14         return -1;
    15     } else if(pid==0) {
    16         globvar++;
    17         var++;
    18     } else {
    19         sleep(2);
    20     }
    21 
    22     printf("pid = %ld,globvar = %d, var = %d
    ",(long)getpid(),globvar,var);
    23 
    24     exit(0);
    25 }

    执行./a.out,输出如下

    a write to stdout
    before fork  //主进程在fork前就输出了
    pid = 855,globvar = 7, var = 89
    pid = 854,globvar = 6, var = 88

    很好理解,因为printf("before fork ")中有回车符,回车符和EOF都会刷新缓冲区,所以在fork前缓冲区是空的。但是要是将输出重定向到tmp.out文件,则在程序推出前, printf的输出都在缓冲区,程序推出前写入文件。

    a write to stdout
    before fork     //子进程的输出
    pid = 859,globvar = 7, var = 89
    before fork  //父进程的输出
    pid = 858,globvar = 6, var = 88

  • 相关阅读:
    Promise对象
    iterator和for of 循环
    vue项目基本流程
    BASH_SOURCE 用法
    Java GC CMS 日志分析
    zookeeper 删除snapshot和transaction log的源码解读
    openresty nginx 安装过程记录
    opentesty--luasocket 安装
    为什么要使用SLF4J而不是Log4J
    要过一遍的博客列表
  • 原文地址:https://www.cnblogs.com/howo/p/8007446.html
Copyright © 2011-2022 走看看