一个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
天行健,君子当自强不息