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

  • 相关阅读:
    ubuntu安装
    k8s 安装
    Blazor 路由
    ISO 8601
    Centos 8使用devstack快速安装openstack最新版
    使用devstack 一键安装 openstack详细过程和遇到的坑
    蓝瑟66000公里保养
    释放rsyslog占用的Linux内存
    Netty4.1 Http开发入门(一)服务端
    网络传输中的帧和payload
  • 原文地址:https://www.cnblogs.com/howo/p/8007446.html
Copyright © 2011-2022 走看看