很简单的代码例子,想要说明的是fork机制当中,子进程也是会将父进程的后续部分代码以及自fork点开始相应的buffer当中内容拷贝到自己的buffer当中(虽然采用的copy-on-write的机制);因此,如果输出buffer的位置在fork点之后,那么子进程依然会拷贝父进程的output-buffer当中的内容;
#include <unistd.h> #include <assert.h> #include <stdio.h> int main(int argc, char **argv){ // $./bin-file fork_times assert(argc == 2); int fork_time = atoi(argv[1]); int i = 0;if(fork_time > 0){ for(; i<fork_time; i++){
#if 1 printf("#"); fork(); #else
fork();
printf("#");
#endif } } return 0; }
假设fork的次数为1, 这里,如果print 前置于fork,那么将输出2个‘#’;而后置情况下则会输出3个‘#’;
如果fork 执行俩次,那么前置情况输出6个,因为共有6个进程产生, 各个进程贡献一个‘#’; 而后置情况下,则会输出8个‘#’;
但是后置情况下,拷贝的内容不会累积,因为每次就只会拷贝一次父进程的buffer;后置情况中,每个子进程会多输出一个‘#’;
当fork_times为3时, 前置输出数目为24, 后置输出数目为28;