IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    100 čĄŒ C äťŁç çťˆçŤŻć‰“ĺ°ć ‘ĺ˝˘çť“ćž„

    (●\'â—Ą\'●)发表于 2017-02-08 10:52:33
    love 0

    čŽ˛çŠśĺĽ—čˇŻäš‹ĺ‰ďźŒĺ…ˆćĽĺ›žç­”ä¸‰ä¸Şé—Žé˘˜ă€‚

    ä¸şäť€äšˆčŚć‰“ĺ°ć ‘ĺ˝˘çť“ćž„

    ć ‘ĺ˝˘çť“ćž„ć˜ŻçŽ—ćł•é‡Œĺžˆĺ¸¸č§çš„ä¸€ç§ć•°ćŽçť“ćž„ďźŒäťŽäşŒĺ‰ć ‘ĺˆ°ĺ¤šĺ‰ć ‘ďźŒčż˜ćœ‰ĺžˆĺ¤šĺ˜ç§ă€‚ĺžˆĺ¤šćś‰ĺŠĺˆ°çŽ—ćł•çš„ĺˇĽä˝œďźŒĺ°ąéœ€čŚç¨‹ĺşĺ‘˜č‡Şĺˇąć‰‹ĺŠ¨ĺŽžçŽ°ć ‘ĺ˝˘çť“ćž„ďźŒä˝†ĺ‡şäşŽçť“ćž„ćœŹčşŤĺ¤ć‚ć€§ďźŒä¸ĺ¤ŞĺŽšć˜“ĺšĺŻšďźŒéœ€čŚä¸€ç§č°ƒčŻ•ĺˇĽĺ…ˇćĽćŁ€ćľ‹ć­ŁçĄŽć€§ă€‚ä¸€čˆŹçš„č°ƒčŻ•ć‰‹ćŽľć— éžĺ°ąć˜ŻĺŠ ć‰“ĺ°ďźŒGDBä¸Šć–­ç‚šďźŒĺ†™ćľ‹čŻ•ç”¨äž‹ç­‰ďźŒä˝†čż™äş›ĺą€éƒ¨äťĽĺŠĺ¤–éƒ¨çš„č°ƒčŻ•äżĄćŻĺŻšäşŽć•°ćŽçť“ćž„çš„ć•´ä˝“ćŠŠćĄćäž›çš„ĺ¸ŽĺŠŠĺĺˆ†ćœ‰é™ďźŒçťéŞŒä¸čśłçš„ç¨‹ĺşĺ‘˜ç”šč‡łĺŻčƒ˝äźščżˇĺ¤ąĺœ¨ä¸€ĺ¤§ç‰‡č°ƒčŻ•äżĄćŻçš„ćąŞć´‹ĺ¤§ćľˇä¸­ć‰žä¸ç€ĺŒ—ă€‚ç†č§ŁçŽ—ćł•ćœŹčşŤć˜Żä¸€ĺ›žäş‹ďźŒč‡ŞĺˇąĺŠ¨ć‰‹ć˜ŻĺŚä¸€ĺ›žäş‹äş†ďźŒčż™čˇŸćˆ‘äťŹç†č§ŁçŽ—ćł•çš„ć€çť´ć–šĺźćœ‰ĺ…łâ€”â€”ĺŻšäşŽć•°ćŽçť“ćž„č€Œč¨€ďźŒćˆ‘äťŹçš„ć„ŸçŸĽć˜Żĺ˝˘čąĄĺŒ–çš„ďźŒćŻ”ć–šč„‘ćľˇä¸­č‡ŞĺŠ¨ĺ‡şçŽ°ä¸€ĺš…ĺ›žďźŒĺŠ¨ć€çš„ć’ĺ…Ľĺˆ é™¤ďźŒćŻä¸ŞčŠ‚ç‚šć˜ŻĺŚ‚ä˝•ĺ˜ĺŠ¨çš„ďźŒĺšłčĄĄçš„ć—śĺ€™ĺą€éƒ¨ć˜Żć€Žäšˆć—‹č˝Źçš„ç­‰ç­‰ďźŒĺŻšć™şĺŠ›ć­Łĺ¸¸çš„äşşćĽčŻ´ä¸ć˜Żäť€äšˆéšžäş‹ă€‚ä˝†ĺŻšćœşĺ™¨ćĽčŻ´ďźŒĺŽƒčŚé˘ĺŻšçš„ć˜ŻĺŞć˜Żä¸€ĺ †ĺŸşäşŽçŠść€çš„ćŒ‡äť¤č€Œĺˇ˛ďźŒĺ°†äşşçš„ĺ˝˘čąĄć€çť´č˝ŹĺŒ–ä¸şçŠść€ćœşďźŒćœŹčşŤć˜Żä¸€äťśč‰°éšžçš„ĺˇĽä˝œďźŒĺ› ä¸şćˆ‘äťŹĺžˆéšžć„ŸçŸĽĺšśĺ­˜ĺ‚¨čż™äšˆĺ¤šçŠść€ďźŒčż™ĺ°ąéœ€čŚĺˇĽĺ…ˇćĽčž…ĺŠŠďźŒćœ€ĺĽ˝ć˜Żç”ťĺ‡şć•´ä¸Şĺ˝˘çŠśçť“ćž„ďźŒäťĽç›´č§‚ĺœ°ćé†’ćˆ‘äťŹĺ“Şé‡Œĺ‡şé”™äş†ďźŒć‰€č°“â€œč§‚ĺ…śĺ˝˘ďźŒč§ĺ…śäš‰â€ă€‚

    ćˆ‘äťŹçŸĽé“Linuxćœ‰ä¸Ştreeĺ‘˝äť¤ç”¨ćĽć‰“ĺ°ć ‘çŠśç›Žĺ˝•ĺˆ—čĄ¨ďźŒĺŻäťĽĺ°†ćŸä¸Şç›Žĺ˝•ä¸‹çš„ć‰€ćœ‰ć–‡äťśĺ’Œĺ­ç›Žĺ˝•ä¸€č§ˆć— é—ďźŒéžĺ¸¸ç›´č§‚ďźŒćœŹć–‡ĺŻäťĽčŻ´ĺ°ąć˜Żä¸şäş†ĺŽžçŽ°čż™ä¸Şć•ˆćžœďźŒĺšśçť™ĺ‡şćşç ĺŽžçŽ°ă€‚

    ä¸şäť€äšˆç”¨ćˇąĺşŚäź˜ĺ…ˆéĺŽ†

    ä¸ťčŚć˜Żć–šäžżčž“ĺ‡şă€‚ĺœ¨çťˆçŤŻčž“ĺ‡şä¸€čˆŹéƒ˝ć˜ŻäťŽĺˇŚč‡łĺłďźŒäťŽä¸Šĺˆ°ä¸‹ďźŒĺŻšäşŽć ‘ĺ˝˘çť“ćž„ćĽčŻ´ďźŒĺ‰č€…č‡Şç„śčĄ¨čžžçš„ć˜ŻäťŽć ščŠ‚ç‚šĺˆ°ĺśĺ­čŠ‚ç‚šďźŒĺŽč€…č‡Şç„śčĄ¨čžžçš„ć˜Żç›¸é‚ťĺˆ†ć”ŻďźŒćˇąĺşŚäź˜ĺ…ˆéĺŽ†çŹŚĺˆčž“ĺ‡şćŹĄĺşă€‚

    ĺŽžé™…ä¸ŠĺšżĺşŚäź˜ĺ…ˆéĺŽ†ĺŽžçŽ°čľˇćĽć›´çŽ€ĺ•ďźŒĺŞčŚĺœ¨ćŻä¸€ĺą‚ĺˇŚçŤŻĺťşçŤ‹ä¸€ä¸Şé“žčĄ¨ĺ¤´ďźŒĺ°†ĺŒä¸€ĺą‚çš„čŠ‚ç‚šć¨Şĺ‘ä¸˛č”čľˇćĽďźŒäťŽä¸Šĺˆ°ä¸‹éĺŽ†é“žčĄ¨ĺ¤´ć•°çť„ĺ°ąĺŻäťĽäş†ă€‚ä˝†č€ƒč™‘äťĽä¸‹ĺ‡ ç‚šďźš

    • ćˆ‘äťŹçš„ĺąĺš•ć˛Ąćœ‰čż™äšˆĺŽ˝ďźŒčśłäťĽĺŽšçşłć•´ćŁľć ‘ďźŒč€Œä¸”ćˆ‘äťŹć›´čś‹ĺ‘äşŽçşľĺ‘ćťšĺŠ¨ćľč§ˆďź›
    • ĺą‚ćŹĄĺ…łçłťĺžˆéšžčĄ¨ç¤şďźŒĺ…‰ĺŽžçŽ°ĺŻšé˝ĺ°ąĺžˆéşťçƒŚďź›
    • ćŻä¸ŞčŠ‚ç‚šéœ€čŚçť´ćŠ¤ä¸€ä¸Şé˘ĺ¤–nextćŒ‡é’ˆďźŒĺŚ‚ćžœčż™ä¸ć˜Żć•°ćŽçť“ćž„ćœŹčşŤć‰€éœ€čŚçš„ćˆĺ‘˜ďźŒĺŻšäşŽĺ­˜ĺ‚¨çŠşé—´ćĽčŻ´ć˜Żä¸Şé˘ĺ¤–çš„č´Ÿć‹…ă€‚

    čż™äšŸčŻ´ć˜ŽćˇąĺşŚäź˜ĺ…ˆéĺŽ†çŹŹäşŒä¸Şäź˜ç‚šďźŒĺŽƒçš„ĺŽžçŽ°ĺŻšäşŽć•°ćŽçť“ćž„ćœŹčşŤć˜Żéžäžľĺ…Ľĺźçš„ă€‚

    ä¸şäť€äšˆä˝żç”¨éžé€’ĺ˝’éĺŽ†

    ĺ…śĺŽžčż™ć˜Żä¸€ä¸Şč§äťč§ć™şçš„é—Žé˘˜ă€‚é€’ĺ˝’čż˜ć˜Żéžé€’ĺ˝’ďźŒä¸čż‡ć˜Żä¸¤ç§ä¸ĺŒçš„éĺŽ†ĺ˝˘ĺźďźŒä¸ĺ­˜ĺœ¨çťĺŻšçš„äź˜ĺŠŁďźŒč€Œä¸”ä¸€čˆŹćƒ…ĺ†ľä¸‹ĺŻäťĽç›¸äş’čĄĽĺ……ă€‚ćˆ‘ä¸Şäşşé€‰ć‹Šéžé€’ĺ˝’ĺ‡şäşŽäťĽä¸‹ĺ‡ ç§ĺ› ç´ ďźš

    • éżĺ…ć ‘ĺą‚ćŹĄčż‡ĺ¤šĺŻźč‡´ĺ‡˝ć•°č°ƒç”¨ĺ †ć ˆćş˘ĺ‡şďź›
    • éżĺ…CčŻ­č¨€ĺ‡˝ć•°č°ƒç”¨ĺź€é”€ďź›
    • ć‰€ćœ‰çŠść€ĺŻč§ĺŻćŽ§ă€‚

    ĺ˝“ç„śäťĽä¸Šĺ› ç´ ĺšśä¸é‡čŚďźŒĺź€ĺżƒĺ°ąĺĽ˝ă€‚

    ä¸€ĺˆ‡çš†ĺĽ—čˇŻďźŒä¸ĺ˜ĺş”ä¸‡ĺ˜

    ć—˘ç„śćœŹć–‡čŽ˛çŠśĺĽ—čˇŻďźŒé‚Łäšˆĺš˛č„†çŽ°ĺœ¨ĺ°ąćŠŠĺĽ—čˇŻçť™ĺ‡şćĽĺĽ˝äş†ďźŒäźŞäťŁç ĺ˝˘ĺźďźš

    /* log寚蹥 */
    typedef struct node_backlog {
        nodećŒ‡é’ˆ;
        ĺ›žćşŻç‚šä˝ç˝Žďźˆç´˘ĺź•ďź‰;
    };
    
    /* Dump */
    void dump(tree) {
        䝎栚节炚埀始迭䝣;
        ĺˆĺ§‹ĺŒ–logĺ †ć ˆ;
        for (; ;) {
            if (čŠ‚ç‚šćŒ‡é’ˆä¸şçŠş) {
                䝎logĺŻščąĄä¸­čŽˇĺ–ĺ›žćşŻç‚šä˝ç˝Ž;
                if (ä¸ĺ­˜ĺœ¨ďźŒćˆ–ć— ć•ˆçš„ĺ›žćşŻç‚š) {
                    ĺŽ‹ć ˆçŠşčŠ‚ç‚šćŒ‡é’ˆ;
                } else {
                    ĺŽ‹ć ˆĺ˝“ĺ‰čŠ‚ç‚šćŒ‡é’ˆďźŒĺŒć—śčŽ°ĺ˝•ä¸‹ä¸€ä¸Şĺ›žćşŻç‚šä˝ç˝Ž;
                }
                if (ĺ›žćşŻç‚šä˝ç˝Žç´˘ĺź•ä¸ş0) {
                    čž“ĺ‡şĺą‚ćŹĄçźŠčż›ă€ç”ťčˇŻĺž„ďźŒć‰“ĺ°čŠ‚ç‚šĺ†…ĺŽš;
                }
                进兼下一幂;
            } else {
                if (logĺ †ć ˆä¸şçŠş) return;
                埚出logĺŻščąĄďźŒčŽˇĺ–ćœ€čż‘čŽ°ĺ˝•çš„čŠ‚ç‚šćŒ‡é’ˆ;
            }
        }
    }

    çŽ€ĺ•ĺ§ďźŸč€Œä¸”ćˆ‘ć•˘čŻ´ďźŒčż™ä¸ŞĺĽ—čˇŻĺŻšäşŽć‰€ćœ‰ć ‘ĺ˝˘çť“ćž„éƒ˝ć˜Żé€šç”¨çš„ďźŒĺŞčŚčƒ˝ĺ¤ŸćˇąĺşŚéĺŽ†ă€‚

    ä¸äżĄćˆ‘çť™ĺ‡şä¸‰ä¸ŞĺŽžćˆ˜äž‹ĺ­ă€‚

    ç›Žĺ˝•ć ‘ćˆ–ĺ­—ĺ…¸ć ‘

    äťŁç ĺœ¨gistă€‚čż™ć˜Żä¸ŞMIBć ‘ďźŒć˜ŻçŽĄç†ç˝‘çťœčŠ‚ç‚šďźˆčŽžĺ¤‡ďź‰ç”¨çš„ă€‚çŽ€čŚĺœ°čŽ˛ďźŒĺŽƒĺ…ˇćœ‰ä¸¤é‡ç‰šć€§ďźš

    • čŠ‚ç‚šäš‹é—´çš„ĺą‚ćŹĄĺľŒĺĽ—ĺ…łçłťďźŒĺ†łĺŽšäş†ĺŽƒĺąžäşŽç›Žĺ˝•ĺą‚ćŹĄçť“ćž„ďź›
    • 节炚的keyĺ…ˇćœ‰ĺ…Źĺ…ąĺ‰çź€ďźŒä˝żĺž—ĺŽƒäšŸçąťäźźäşŽďźˆćˆ–ĺŻç”¨äşŽďź‰ĺ­—ĺ…¸çť“ćž„ă€‚

    ćˆ‘äťŹä¸éœ€čŚĺ…łĺżƒĺ…śCRUDĺŽžçŽ°ďźŒĺŞéœ€čŚçŸĽé“ćœ‰ä¸€ćŁľçŽ°ćˆçš„ç›Žĺ˝•ć ‘ćˆ–č€…ĺ­—ĺ…¸ć ‘ďźŒćˆ‘äťŹĺŚ‚ä˝•ĺœ¨çťˆçŤŻčž“ĺ‡şĺŽƒçš„ĺ˝˘çŠśă€‚

    #define OID_MAX_LEN  64
    
    struct node_backlog {
        /* node to be backlogged */
        struct mib_node *node;
        /* the backtrack point, next to the orignal sub-index of the node, valid when >= 1, invalid == 0 */
        int next_sub_idx;
    };
    
    static inline void
    nbl_push(struct node_backlog *nbl, struct node_backlog **top, struct node_backlog **bottom) {
        if (*top - *bottom< OID_MAX_LEN) {
            (*(*top)++) = *nbl;
        }
    }
    
    static inline struct node_backlog *
    nbl_pop(struct node_backlog **top, struct node_backlog **bottom) {
        return *top > *bottom? --*top : NULL;
    }
    
    void mib_tree_dump(void) {
        int level = 0;
        oid_t id = 0;
        struct mib_node *node = *dummy_root; 
        struct node_backlog nbl, *p_nbl = NULL;
        struct node_backlog *top, *bottom, nbl_stack[OID_MAX_LEN];
    
        top = bottom = nbl_stack;
    
        for (; ;) {
            if (node != NULL) {
                /* Fetch the pop-up backlogged node's sub-id. If not backlogged, set 0. */
                int sub_idx = p_nbl != NULL ? p_nbl->next_sub_idx : 0;
                /* Reset backlog for the node has gone deep down */
                p_nbl = NULL;
    
                /* Backlog the node */
                if (is_leaf(node) || sub_idx + 1 >= node->sub_id_cnt) {
                    nbl.node = NULL;
                    nbl.next_sub_idx = 0;
                } else {
                    nbl.node = node;
                    nbl.next_sub_idx = sub_idx + 1;
                }
                nbl_push(*nbl, *top, *bottom);
                level++;
    
                /* Draw lines as long as sub_idx is the first one */
                if (sub_idx == 0) {
                    int i;
                    for (i = 1; i < level; i++) {
                        if (i == level - 1) {
                            printf("%-8s", "+-------");
                        } else {
                            if (nbl_stack[i - 1].node != NULL) {
                                printf("%-8s", "|");
                            } else {
                                printf("%-8s", " ");
                            }
                        }
                    }
                    printf("%s(%d)\n", node->name, id);
                }
    
                /* Go deep down */
                id = node->sub_id[sub_idx];
                node = node->sub_ptr[sub_idx];
            } else {
                p_nbl = nbl_pop(*top, *bottom);
                if (p_nbl == NULL) {
                    /* End of traversal */
                    break;
                }
                node = p_nbl->node;
                level--;
            }
        }
    }

    äťŁç ä¸çŽ—ĺ¤ć‚ďźŒĺ°ąčŽ˛ĺ‡ ä¸ŞčŚç‚š

    ćˇąĺşŚäź˜ĺ…ˆéĺŽ†čŚĺˆŠç”¨ĺ›žćşŻç‚šďźŒĺ°ąć˜Żčľ°ĺˆ°ä¸€ä¸Şĺˆ†ć”Żçš„ĺ°˝ĺ¤´ĺŽďźŒä¸ŠćşŻĺˆ°ĺŽŸĺ…ˆčˇŻčż‡çš„ćŸä¸Şä˝ç˝ŽďźŒäťŽĺŚä¸€ä¸Şĺˆ†ć”Żçť§çť­éĺŽ†ďźŒĺŚ‚ćžœĺ›žćşŻĺˆ°ć ščŠ‚ç‚šďźŒĺ°ąčŻ´ć˜ŽéĺŽ†çť“ćŸäş†ďźŒć‰€äťĽďźŒĺ›žćşŻç‚šć˜Żĺż…éĄťčŚčŽ°ĺ˝•çš„ă€‚é—Žé˘˜ć˜ŻčŽ°ĺ˝•ĺ“Şä¸Şä˝ç˝Žĺ‘˘ďźŸäťĽäşŒĺ‰ć ‘ä¸şäž‹ďźŒéĺŽ†äş†ĺˇŚĺ­ć ‘ĺŽďźŒćŽĽä¸‹ćĽéĺŽ†çš„ĺ°ąć˜Żĺłĺ­ć ‘ďźŒć‰€äťĽĺ›žćşŻç‚šć˜Żĺłĺ­Šĺ­ďź›ĺŻšäşŽĺ¤šĺ‰ć ‘ďźŒéĺŽ†çŹŹNä¸Şĺˆ†ć”ŻĺŽďźŒćŽĽä¸‹ćĽčŚéĺŽ†N+1ĺˆ†ć”ŻďźŒć‰€äťĽĺ›žćşŻç‚šć˜ŻN+1ďź›ĺŚ‚ćžœéĺŽ†ĺŽŒćœ€ĺŽä¸€ä¸Şĺˆ†ć”ŻďźŒĺˆ™éœ€čŚçť§çť­ä¸ŠćşŻĺŻťć‰žĺ›žćşŻç‚šäş†ă€‚ć‰€äťĽĺ‘˘ďźŒćˆ‘äťŹĺ°ąç”¨sub_idx + 1ćĽčŽ°ĺ˝•ĺ›žćşŻç‚šďźŒćˆ‘äťŹčż˜ĺŻäťĽĺˆŠç”¨čż™ä¸Şĺąžć€§ĺšä¸Şĺˆ†çąťďźŒĺ€źĺ¤§äşŽç­‰äşŽ1ć—śďźŒĺ›žćşŻç‚šćœ‰ć•ˆďźŒĺ€źç­‰äşŽ0ďźŒĺ›žćşŻç‚šć— ć•ˆă€‚

    关于logĺ †ć ˆć“ä˝œďźŒčż™é‡Œä˝żç”¨äş†äşŒçş§ćŒ‡é’ˆçš„ćŠ€ĺˇ§ă€‚čż™ä¸Şĺ †ć ˆĺĺˆ†ĺ°ĺˇ§ďźŒć‰€äťĽĺˆŠç”¨ĺ‡˝ć•°ĺą€éƒ¨ĺ˜é‡ĺšĺ­˜ĺ‚¨äšŸćœŞĺ°ä¸ĺŻďźŒčż˜ćœ‰ä¸éœ€čŚĺŻšĺ¤–ćš´éœ˛ć•°ćŽçš„ĺĽ˝ĺ¤„ă€‚é‚ŁäšˆĺŻšäşŽĺ †ć ˆćŒ‡é’ˆďźŒĺ°ąéœ€čŚäź é€’äşŒćŹĄćŒ‡é’ˆćĽć”šĺ˜ĺŽƒă€‚ćŻ”ĺŚ‚ćˆ‘äťŹçœ‹ĺ…Ľć ˆć“ä˝œďźš

    (*(*top)++) = *nbl;

    čż™ć˜Żĺ°†logĺŻščąĄć‹ˇč´çť™topćŒ‡ĺ‘ä˝ç˝ŽďźŒç„śĺŽĺ°†topćŒ‡é’ˆä¸Šç§ťďźŒtopĺ’Œbottomçš„ĺˇŽĺ€źĺ°ąć˜Żĺ †ć ˆĺ…ƒç´ çš„ć•°ç›Žă€‚ç”ąäşŽtopć˜ŻäşŒçş§ćŒ‡é’ˆďźŒć‰€äťĽč˘Ťčľ‹ĺ€źçš„ć˜Ż**topďźŒćŒ‡é’ˆç§ťĺŠ¨ĺ°ąć˜Ż(*top)++ă€‚ĺ†ćĽçœ‹ĺ‡şć ˆć“ä˝œďźš

    return --*top;

    ĺ…ˆĺ°†topä¸‹ç§ťä¸€ä¸Şĺ•ä˝ďźŒç„śĺŽčż”ĺ›žć‰€ćŒ‡ĺ‘çš„logĺŻščąĄďźŒäšŸĺ°ąć˜Ż*top。

    ćŽĽä¸‹ćĽčŻĽćˇąĺ…ĽčŽ˛č§ŁĺĽ—čˇŻäş†ďźŒéŚ–ĺ…ˆďźŒć ščŠ‚ç‚ščŽžç˝Žćˆäş†dummyďźŒčż™ć˜Żä¸€ä¸Şč™šć‹ŸčŠ‚ç‚šďźŒć˜Żä¸şäş†äżčŻćœ€ä¸Šĺą‚ĺŞćœ‰ä¸€ä¸ŞčŠ‚ç‚šč€Œä˝żç”¨çš„çź–ç ćŠ€ĺˇ§ďźŒĺĽ˝ćŻ”treeĺ‘˝äť¤čž“ĺ‡şç›Žĺ˝•ć ‘ć€ťć˜ŻäťŽĺ˝“ĺ‰ç›Žĺ˝•â€œ.â€ĺź€ĺ§‹ă€‚ç”ąäşŽçŹŹä¸€ćŹĄčż›ĺ…ĽĺžŞçŽŻďźŒlogĺ †ć ˆä¸şçŠşďźŒä¸ĺ­˜ĺœ¨ć‰€č°“ĺ›žćşŻç‚šďźŒćˆ‘äťŹĺ°†ĺ›žćşŻä˝ç˝Žç´˘ĺź•čŽžä¸ş0ďźŒčż™ćœ‰ä¸¤é‡ĺŤäš‰ďźŒä¸€ćĽčĄ¨ç¤şčŻĽĺ›žćşŻç‚šć— ć•ˆćˆ–ä¸ĺ­˜ĺœ¨ďźŒäşŒćĽć—˘ç„ść˛Ąćœ‰ĺ›žćşŻďźŒé‚ŁäšˆćŽĽä¸‹ćĽĺ°ąäťŽĺ˝“ĺ‰čŠ‚ç‚šçš„çŹŹä¸€ä¸Şĺˆ†ć”Żĺź€ĺ§‹éĺŽ†ă€‚

    ç„śĺŽćˆ‘äťŹĺ°†éĺŽ†čż‡çš„čŠ‚ç‚šĺŽ‹ć ˆďźŒčż™é‡ŒäšŸć˜Żćœ‰ĺŒşĺˆ†çš„ďźšĺŚ‚ćžœĺ˝“ĺ‰ć˜Żĺśĺ­čŠ‚ç‚šďźŒćˆ–č€…ć‰€ćœ‰ĺˆ†ć”Żéƒ˝éĺŽ†ĺŽŒäş†ďźŒé‚Łäšˆĺş”čŻĽçť§çť­ä¸ŠćşŻĺŽťĺŻťć‰žĺ›žćşŻç‚šďźŒćˆ‘äťŹĺ°ąĺ°†ĺ›žćşŻç‚ščŽžä¸şć— ć•ˆĺŽĺŽ‹ć ˆďź›ĺŚĺˆ™ĺ°ąĺ°†ĺ˝“ĺ‰čŠ‚ç‚ščŽžä¸şĺ›žćşŻç‚šďźŒĺšśčŽ°ĺ˝•ä˝ç˝Žç´˘ĺź•ĺŽĺŽ‹ć ˆă€‚

    ç”ťçşżčž“ĺ‡şéƒ¨ĺˆ†ç¨ĺŽčŽ˛ă€‚ćˆ‘äťŹć šćŽĺ‰é˘čŽˇĺ–çš„ç´˘ĺź•sub_idxčż›ĺ…Ľä¸‹ä¸€ĺą‚ďźŒç›´ĺˆ°č§Śĺş•ĺ›žćşŻďźŒčż™ć—śäťŽlogĺ †ć ˆĺźšĺ‡şĺ›žćşŻç‚šďźŒpopćœ‰ä¸‰ç§ćƒ…ĺ†ľďźšç”ąäşŽçŹŹä¸€ä¸ŞĺŽ‹ć ˆä¸şć ščŠ‚ç‚šďźŒĺ †ć ˆä¸şçŠşčĄ¨ç¤şĺ›žćşŻĺˆ°ĺŽŸç‚šďźŒäšŸĺ°ąć ‡ĺż—ç€ć•´ä¸ŞéĺŽ†çť“ćŸďźŒé€€ĺ‡şĺžŞçŽŻďź›ĺŚĺˆ™ćŸĽçœ‹ĺ›žćşŻç‚šć˜ŻĺŚä¸şNULLďźŒĺŚ‚ćžœçŠşĺŚ‚ĺ‰ć‰€čż°çť§çť­ä¸ŠćşŻďź›ĺŚ‚ćžœĺ­˜ĺœ¨ćœ‰ć•ˆĺ›žćşŻç‚šďźŒĺˆ™ĺ°†ĺ›žćşŻä˝ç˝Žç´˘ĺź•ĺ–ĺ‡şďźŒçť§çť­ä¸‹ä¸€č˝ŽéĺŽ†ĺžŞçŽŻă€‚

    ćœ€ĺŽčŽ˛çťˆçŤŻčž“ĺ‡şă€‚ĺ‰é˘čŻ´čż‡ćŻä¸€čĄŒäťŽĺˇŚč‡łĺłçš„čž“ĺ‡şçš„ć˜Żć ‘çš„ĺą‚ćŹĄéĺŽ†ďźŒĺ…śĺŽžĺ°ąć˜ŻéĺŽ†logĺ †ć ˆďź›ć˘čĄŒčž“ĺ‡şĺ°ąć˜Żć ‘çš„ĺˆ†ć”ŻéĺŽ†ďźŒĺ°ąć˜ŻćŻä¸€č˝ŽĺžŞçŽŻă€‚čž“ĺ‡şĺ†…ĺŽšä¸ťčŚć˜Żä¸‰ä¸ŞçŹŚĺˇďźšçźŠčż›ă€ĺˆ†ć”Żĺ’ŒčŠ‚ç‚šĺ†…ĺŽšă€‚ćˆ‘äťŹä˝œĺŚ‚ä¸‹ç­–ç•Ľďźš

    • çźŠčż›ďźšĺ˝“ĺ †ć ˆé‡Œĺ›žćşŻç‚šć— ć•ˆďźŒĺˆ™ä¸ĺ­˜ĺœ¨ĺˆ†ć”ŻďźŒć‰“ĺ°çŠşć źďźŒĺ…Ťä¸Şĺ­—çŹŚĺŻšé˝ďź›
    • ĺˆ†ć”Żďźšĺ˝“ĺ †ć ˆé‡Œĺ›žćşŻç‚šćœ‰ć•ˆďźŒčĄ¨ç¤şĺ­˜ĺœ¨ĺˆ†ć”ŻďźŒć‰“ĺ°â€œ|â€ĺ’ŒçŠşć źďźŒĺ…Ťä¸Şĺ­—çŹŚĺŻšé˝ďź›
    • čŠ‚ç‚šďźšĺ˝“ĺ †ć ˆéĺŽ†ĺˆ°ćœ€ĺŽä¸€ä¸Şĺ…ƒç´ ďźŒčĄ¨ç¤şĺŽé˘ĺ°†čŚčž“ĺ‡şčŠ‚ç‚šĺ†…ĺŽšďźŒć‰“ĺ°â€œ+—â€ďźŒĺ…Ťä¸Şĺ­—çŹŚĺŻšé˝ďźŒĺŽé˘čˇŸčŠ‚ç‚šĺ†…ĺŽšă€‚

    ĺ˝“ç„śä˝ äšŸĺŻäťĽč‡ŞĺŽšäš‰ć‰“ĺ°ç­–ç•ĽäťĽäžżčž“ĺ‡şć›´çžŽč§‚ă€‚ĺĽ˝äş†ďźŒčŻ´äş†ä¸€ĺ¤§ĺ †ďźŒçœ‹ć•ˆćžœĺ§ďźŒčżčĄŒç¨‹ĺşďźŒä¸€ç›Žäş†ç„śă€‚

    B+ć ‘

    äťŁç ĺœ¨ć­¤ă€‚B+ć ‘ć˜Żĺ…łçłťć•°ćŽĺş“ĺ¸¸ç”¨çš„ĺş•ĺą‚ć•°ćŽçť“ćž„ďźŒĺŽžçŽ°čľˇćĽç›¸ĺ˝“ćć€–ďźŒć‰€ĺš¸ćœŹć–‡ä¸čŽ˛čż™äş›ďźŒčż™é‡ŒĺŞć˜Żĺ°†B+ć ‘ä˝œä¸şĺ¤šĺ‰ć ‘ç¤şčŒƒĺŚ‚ä˝•ć‰“ĺ°ďźŒç‰šĺˆŤć˜Żĺśĺ­čŠ‚ç‚šĺ’Œéžĺśĺ­čŠ‚ç‚šćœŹčşŤĺŽšäš‰ä¸ĺŒçš„ćƒ…ĺ†ľä¸‹ă€‚äťŽčž“ĺ‡şĺŽžçŽ°ä¸Šćˆ‘äťŹĺ‘çŽ°ďźŒlogĺŻščąĄčŽ°ĺ˝•çš„ĺŞć˜ŻčŠ‚ç‚šçš„ćŒ‡é’ˆĺ’Œĺ›žćşŻä˝ç˝ŽďźŒĺŒć•°ćŽčŠ‚ç‚šćœŹčşŤć˛Ąćœ‰ĺ…łçłťă€‚ćˆ‘äťŹĺ‡ äšŽĺŻäťĽĺŽŸĺ°ä¸ĺŠ¨ĺœ°ćŠŠä¸Šé˘çš„äťŁç ćŹčż‡ćĽďźŒčżčĄŒć•ˆćžœĺŚ‚ä¸‹ďźš

    äťŽĺ˝˘çŠśä¸ŠĺŻäťĽçœ‹ĺˆ°B+ć ‘çš„çœŸĺŽžć•°ćŽéƒ˝ĺ­˜ĺ‚¨ĺœ¨ĺśĺ­čŠ‚ç‚šďźŒč€Œä¸”ć•´ćŁľć ‘ć˜ŻĺšłčĄĄçš„ă€‚

    çş˘éť‘ć ‘ďźˆäşŒĺ‰ć ‘ďź‰

    äťŁç ĺœ¨ć­¤ă€‚ç†č§Łäş†ĺ¤šĺ‰ć ‘çš„ĺŽžçŽ°ďźŒäşŒĺ‰ć ‘ä¸čż‡ć˜Żä¸€ç§ç‰šćŽŠçŽ€ĺŒ–ĺ˝˘ĺźç˝˘äş†ă€‚ćœŹć–‡ćŒ‘é€‰äş†çş˘éť‘ć ‘ä¸şäťŁčĄ¨ďźŒäťŁç č‡Şĺˇąć‡’ĺž—ĺ†™äş†ďźŒç›´ćŽĽć‹żNginx源码。

    č§‚ĺŻŸĺž—ĺ‡şďźŒäşŒĺ‰ć ‘ĺ…łäşŽĺ›žćşŻç‚šçš„ä˝ç˝Žĺ…śĺŽžĺŞćœ‰ĺłčžšĺˆ†ć”ŻďźŒäšŸĺ°ąć˜ŻčŻ´ĺ›žćşŻä˝ç˝Žç´˘ĺź•ĺŞćœ‰ä¸€ä¸Şĺ€źďźŒĺ°ąć˜Ż1ă€‚čż™ć ˇä¸€ćĽćˆ‘äťŹĺŻäťĽĺšä¸ŞçŽ€ĺŒ–ďźŒĺ°†ĺˇŚĺˆ†ć”Żç´˘ĺź•čŽžä¸ş0čĄ¨ç¤şć— ć•ˆĺ›žćşŻä˝ç˝ŽďźŒĺłĺˆ†ć”Żç´˘ĺź•čŽžä¸ş1čĄ¨ç¤şćœ‰ć•ˆĺ›žćşŻä˝ç˝ŽďźŒäťŁç ĺŻäťĽčż™ć ˇĺ†™ďźš

    #define RBTREE_MAX_LEVEL   64
    #define RBTREE_LEFT_INDEX  0
    #define RBTREE_RIGHT_INDEX 1
    
    void rbtree_dump(struct rbtree *tree)
    {
        int level = 0;
        struct rbnode *node = tree->root, *sentinel = tree->sentinel;
        struct node_backlog nbl, *p_nbl = NULL;
        struct node_backlog *top, *bottom, nbl_stack[RBTREE_MAX_LEVEL];
    
        top = bottom = nbl_stack;
    
        for (; ;) {
            if (node != sentinel) {
                /* Fetch the pop-up backlogged node's sub-id. If not backlogged, set 0. */
                int sub_index = p_nbl != NULL ? p_nbl->next_sub_idx : RBTREE_LEFT_INDEX;
                /* backlog should be reset since node has gone deep down */
                p_nbl = NULL;
    
                /* Backlog the node */
                if (is_leaf(node, sentinel) || sub_index == RBTREE_RIGHT_INDEX) {
                    nbl.node = sentinel;
                    nbl.next_sub_idx = RBTREE_LEFT_INDEX;
                } else {
                    nbl.node = node;
                    nbl.next_sub_idx = RBTREE_RIGHT_INDEX;
                }
                nbl_push(&nbl, &top, &bottom);
                level++;
    
                /* Draw lines as long as sub_idx is the first one */
                if (sub_index == RBTREE_LEFT_INDEX) {
                    /* Print intent, branch and node content... */
                }
    
                /* Move down according to sub_idx */
                node = sub_index == RBTREE_LEFT_INDEX ? node->left : node->right;
            } else {
                /* Pop up the node backlog... */
            }
        }
    }

    čŽŠćˆ‘äťŹçœ‹ä¸€çœ‹čž“ĺ‡şć•ˆćžœâ€Śâ€Śç­‰ç­‰ďźŒćˆ‘äťŹĺ‘çŽ°ĺŻšäşŽäşŒĺ‰ć ‘ďźŒĺłĺ­Šĺ­ĺœ¨ĺˇŚĺ­Šĺ­çš„ä¸‹ä¸€čĄŒć‰“ĺ°ďźŒč§†č§‰ä¸Šćœ‰ç‚šä¸äš ćƒŻć˜Żĺ—ďźŸčż˜ĺĽ˝ćˆ‘č´´ĺżƒĺœ°ĺ°†LEFT_INDEXĺ’ŒRIGHT_INDEXäş¤ć˘äş†ä¸€ä¸‹ćŹĄĺşďźŒĺłĺ­Šĺ­ĺ°ąĺ…ˆäşŽĺˇŚĺ­Šĺ­čž“ĺ‡şäş†ďźŒčż™ć ˇä¸€ćĽä˝ ĺ°ąĺŻäťĽć­Şç€č„‘č˘‹ç›´č§‚ĺœ°çœ‹äşŒĺ‰ć ‘äş†ďźˆçŹ‘ďź‰ďźŒĺŒć—śćˆ‘äťŹčż˜çŸĽé“ďźŒâ€œçżťč˝Źâ€ä¸€ćŁľäşŒĺ‰ć ‘ć˜Żĺ¤šäšˆĺŽšć˜“ďźˆçŹ‘ďź‰ă€‚

    ĺˇĽćŹ˛ĺ–„ĺ…śäş‹ďźŒĺż…ĺ…ˆĺˆŠĺ…śĺ™¨ă€‚ĺ­Śäźšäş†ć ‘ĺ˝˘çť“ćž„ć‰“ĺ°ĺˇĽĺ…ˇďźŒé’ˆĺŻščż™ć ˇçš„ć•°ćŽçť“ćž„ďźŒĺŞćœ‰ä˝ ĺ†™ä¸äş†çš„ďźŒć˛Ąćœ‰ä˝ ĺ†™ä¸ĺŻšçš„ă€‚ćœ€ĺŽçť™ĺ‡şä¸€ä¸Şć€č€ƒé˘˜ďźšĺŚ‚ä˝•ç”¨é€’ĺ˝’ĺ˝˘ĺźĺŽžçŽ°ć‰“ĺ°ć ‘ĺ˝˘çť“ćž„ďźŸďźˆćç¤şďźšĺˆŠç”¨ĺ‚ć•°äź é€’ďź‰

    ĺ‚č€ƒćşç 

    盎录树 B+树 红靑树

    100 čĄŒ C äťŁç çťˆçŤŻć‰“ĺ°ć ‘ĺ˝˘çť“ćž„ďźŒéŚ–ĺ‘äşŽć–‡çŤ  - äźŻäšĺœ¨çşżă€‚



沪ICP备19023445号-2号
友情链接