#include <iostream> #include <sys/types.h> #include <unistd.h> using namespace std; int main (int argc, char *argv[]) { printf("%d %d\n", getpid(), getppid()); if(fork() == 0) { printf("%d %d\n", getpid(), getppid()); } return(0); }
代码如上,如果直接在终端执行,结果如下:
如果重定向到文件,则结果为:
原因是linux下默认的缓存方式引起的。linux默认的缓存方式如下:
屏幕、键盘和终端等交互作用设备 | 磁盘文件、管道等非交互作用设备 | |
标准输出 | 行缓存 | 块缓存 |
标准出错 | 无缓存 | 无缓存 |
因为在屏幕输出是行缓存模式,所以直接就把两句话print了。
输出到文件时,首先是子进程结束,它结束的时候,才会写文件。这时候缓存里有主进程和子进程的两句话(子进程会从父进程那里拷贝内存的),所以就写到文件里了。然后父进程退出,父近程还是有一句话缓存的。所以有输出了一句话到文件里。这样就成了三句。