一个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\n";
 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\n");
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\n",(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\n")中有回车符,回车符和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

 

posted @ 2017-12-08 23:05  guhowo  阅读(314)  评论(0编辑  收藏  举报