1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int
main( void )
{ int
i;
for (i=0; i<2; i++){
fork();
printf ( "-" );
}
return
0;
} |
输出结果不是6个减号,而是8个,如果你见过此题,当不足为奇。因为,子进程复制了父进程缓冲区——而由于printf没带\n,导致把一个咱的缓冲器给了后代,直到(子)进程结束时才把缓冲区所有内容一起打出来。
为了简化问题,先修改printf语句为:
printf
(
"ppid=%d, pid=%d, i=%d
\n"
, getppid(), getpid(), i);
我本机得结果如下,
ppid=13678, pid=4116, i=0
ppid=4116, pid=4117, i=0
ppid=13678,
pid=4116, i=1
ppid=4116, pid=4118, i=1
ppid=4116, pid=4117,
i=1
ppid=4117, pid=4119, i=1
可理解为按如下流程执行的(下图中注释格式为“进程号/执行顺序/缓冲区中i的值”)
作为验证,把printf语句改为printf
(
"ppid=%d, pid=%d, i=%d
split "
, getppid(), getpid(), i);这里的split作为自定义的分隔符。
程序执行输出是
ppid=1406, pid=1407, i=0 split ppid=1407, pid=1408, i=1 split ppid=1406, pid=1407, i=0 split ppid=1406, pid=1407, i=1 split ppid=13678, pid=1406, i=0 split ppid=1406, pid=1409, i=1 split ppid=13678, pid=1406, i=0 split ppid=13678, pid=1406, i=1 split
提示执行图示如下,
此题得解。
扩展:假如for结束条件为i<3呢?数出多少个减号?答案是24个!