zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    经典SQL例题
    truncate,delete,drop的异同点
    scp 在不同主机之间数据传输
    自定义标签库
    servlet 学习
    HTTP协议 学习
    Tomcat服务器的数字证书 HTTPS 连接!
    JSP开发 路径问题汇总
    java 文件上传 下载 总结
    myeclipse 出现换行符和空格符 解决方案 换行出现乱码
  • 原文地址:https://www.cnblogs.com/superniaoren/p/3345281.html
Copyright © 2011-2022 走看看