深入理解计算系统,499页有这么一个例题。这个例题的输出会产生多少行?可能顺序是什么?
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <unistd.h>
4 #include<sys/wait.h>
5
6 int main(){
7 int status;
8 pid_t pid;
9 printf("hello\n");
10 pid=fork();
11 printf("%d\n",!pid);
12 if(pid!=0){
13 if(waitpid(-1,&status,0)>0){
14 if(WIFEXITED(status)!=0)
15 printf("%d\n",WEXITSTATUS(status));
16 }
17 }
18 printf("bye\n");
19 exit(2);
20 }
一个可行的输出结果可能是这样的:
hello
0
1
bye
2
bye
其中 2,bye是最后要输出的。因为父进程要等待子进程的结束。Hello 是第一次要输出的。
现在我们讨论的焦点是,printf("hello\n")会不会被子进程copy ?
在第9行中,去掉“\n" ,结果如下:
hello0
hello1
bye
2
bye
这是因为不加 "\n"时,”hello"在缓冲区中,未输出。子进程会copy父进程中的缓冲区。