fork()的一点学习辨识

很简单的代码例子,想要说明的是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;

原文地址:https://www.cnblogs.com/superniaoren/p/3345281.html