【答案解析】 要弄明白本题的输出结果,就必须弄懂fork函数的运行机理。
fork()函数是Unix操作系统下以自身进程创建子进程的系统调用,通过系统调用创建一个与原来进程几乎完全相同的进程,一个是子进程,一个是父进程,该子进程拥有与父进程相同的堆栈空间,也就是说,两个进程可以做完全相同的事,可以理解为它们俩是双胞胎兄弟,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。在fork()函数的调用处,整个父进程空间会原模原样地复制到子进程中,包括指令、变量值、程序调用栈、环境变量和缓冲区等。
fork()函数的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,且可能有三种不同的返回值:
1)在父进程中,fork()函数返回新创建子进程的进程ID。
2)在子进程中,fork()函数返回0。
3)如果出现错误,fork()函数返回一个负值。
所以,可以通过fork()函数的返回值来判断当前进程是子进程还是父进程。
当printf函数遇到了换行符“\n”,或EOF,或缓冲区满,或文件描述符关闭,或主动flush,或程序退出时,就会把数据刷出缓冲区。对于本题而言,printf("-\n")中有换行,因此会马上输出而不会缓存,所以,此时会打印6个“-”。
执行过程如图所示。