莲犜弗衯䚋ĺ‰ďźŒĺ…ˆćĽĺ›žç”ä¸‰ä¸Şé—Žé˘˜ă€‚
ć ‘ĺ˝˘çť“ćž„ć˜ŻçŽ—ćł•é‡Œĺžˆĺ¸¸č§çš„一ç§ć•°ćŽçť“ćž„ďźŒäťŽäşŒĺ‰ć ‘ĺˆ°ĺ¤šĺ‰ć ‘ďźŒčż˜ćœ‰ĺžˆĺ¤šĺ˜ç§ă€‚ĺžˆĺ¤šćś‰ĺŠĺˆ°çŽ—ćł•çš„ĺˇĽä˝œďźŒĺ°ąéœ€čŚç¨‹ĺşĺ‘˜č‡Şĺˇąć‰‹ĺŠ¨ĺŽžçŽ°ć ‘ĺ˝˘çť“ćž„ďźŒä˝†ĺ‡şäşŽçť“ćž„ćœŹčşŤĺ¤ć‚ć€§ďźŒä¸ĺ¤ŞĺŽšć˜“ĺšĺŻšďźŒéœ€čŚä¸€ç§č°ƒčŻ•ĺˇĽĺ…ˇćĽćŁ€ćľ‹ćŁçĄŽć€§ă€‚ä¸€čˆŹçš„č°ƒčŻ•ć‰‹ćŽľć— éžĺ°ąć˜ŻĺР㉓ĺ°ďźŒGDB上ć–ç‚šďźŒĺ†™ćľ‹čŻ•ç”¨äž‹ç‰ďźŒä˝†čż™äş›ĺą€éƒ¨äťĽĺŠĺ¤–éƒ¨çš„č°ƒčŻ•äżĄćŻĺŻšäşŽć•°ćŽçť“构的整体把ćĄć䞛的帎劊ĺĺˆ†ćœ‰é™ďźŒçťéŞŒä¸čśłçš„程ĺşĺ‘˜ç”šč‡łĺŻčƒ˝äźščżˇĺ¤ąĺœ¨ä¸€ĺ¤§ç‰‡č°ƒčŻ•äżĄćŻçš„湪洋大澡ä¸ć‰žä¸ç€ĺŒ—。ç†č§ŁçŽ—ćł•ćœŹčşŤć˜Żä¸€ĺ›žäş‹ďźŒč‡ŞĺˇąĺŠ¨ć‰‹ć˜ŻĺŚä¸€ĺ›žäş‹äş†ďźŒčż™čˇŸćˆ‘䝏ç†č§ŁçŽ—ćł•çš„ć€çť´ć–šĺźćœ‰ĺ…łâ€”—寚于数ćŽçť“ćž„č€Œč¨€ďźŒćˆ‘äťŹçš„ć„ŸçŸĽć˜Żĺ˝˘čąĄĺŒ–çš„ďźŒćŻ”ć–šč„‘ćľˇä¸č‡ŞĺŠ¨ĺ‡şçŽ°ä¸€ĺš…ĺ›žďźŒĺŠ¨ć€çš„ć’ĺ…Ľĺˆ é™¤ďźŒćŻä¸ŞčŠ‚ç‚šć˜ŻĺŚ‚ä˝•ĺ˜ĺŠ¨çš„ďźŒĺšłčĄĄçš„ć—śĺ€™ĺą€éƒ¨ć˜Żć€Žäšˆć—‹č˝Źçš„ç‰ç‰ďźŒĺŻšć™şĺŠ›ćŁĺ¸¸çš„äşşćĽčŻ´ä¸ć˜Żäť€äšˆéšžäş‹ă€‚ä˝†ĺŻšćœşĺ™¨ćĽčŻ´ďźŒĺŽƒčŚé˘ĺŻšçš„ć˜ŻĺŞć˜Żä¸€ĺ †ĺŸşäşŽçŠść€çš„ćŒ‡äť¤č€Œĺˇ˛ďźŒĺ°†äşşçš„ĺ˝˘čąĄć€çť´č˝ŹĺŒ–为犜ć€ćœşďźŒćœŹčşŤć˜Żä¸€äťśč‰°éšžçš„ĺˇĽä˝œďźŒĺ› ä¸şćˆ‘äťŹĺžˆéšžć„ŸçŸĽĺšśĺ˜ĺ‚¨čż™äšˆĺ¤šçŠść€ďźŒčż™ĺ°ąéœ€čŚĺˇĽĺ…ˇćĽčž…ĺŠŠďźŒćœ€ĺĽ˝ć˜Żç”ťĺ‡şć•´ä¸Şĺ˝˘çŠśçť“ćž„ďźŒäťĽç›´č§‚ĺœ°ćé†’ćˆ‘äťŹĺ“Şé‡Œĺ‡şé”™äş†ďźŒć‰€č°“â€œč§‚ĺ…śĺ˝˘ďźŒč§ĺ…śäš‰â€ă€‚
ćˆ‘äťŹçŸĽé“Linuxćœ‰ä¸Ştree命䝤用ćĽć‰“ĺ°ć ‘çŠśç›Žĺ˝•ĺˆ—čĄ¨ďźŒĺŻäťĽĺ°†ćŸä¸Şç›Žĺ˝•ä¸‹çš„ć‰€ćœ‰ć–‡äťśĺ’Œĺç›Žĺ˝•ä¸€č§ˆć— é—ďźŒéžĺ¸¸ç›´č§‚ďźŒćœŹć–‡ĺŻäťĽčŻ´ĺ°ąć˜Żä¸şäş†ĺŽžçŽ°čż™ä¸Şć•ˆćžœďźŒĺšśçť™ĺ‡şćşç 厞现。
丝čŚć˜Żć–šäžżčž“ĺ‡şă€‚ĺœ¨çťˆçŤŻčž“ĺ‡şä¸€čˆŹéƒ˝ć˜ŻäťŽĺˇŚč‡łĺłďźŒäťŽä¸Šĺˆ°ä¸‹ďźŒĺŻšäşŽć ‘ĺ˝˘çť“ćž„ćĽčŻ´ďźŒĺ‰č€…č‡Şç„śčĄ¨čžžçš„ć˜ŻäťŽć ščŠ‚ç‚šĺˆ°ĺśĺčŠ‚ç‚šďźŒĺŽč€…č‡Şç„śčĄ¨čžžçš„ć˜Żç›¸é‚ťĺˆ†ć”ŻďźŒćˇąĺşŚäź˜ĺ…ˆé历珌ĺˆčž“出揥ĺşă€‚
ĺŽžé™…ä¸ŠĺšżĺşŚäź˜ĺ…ˆé历厞现辡ćĽć›´çŽ€ĺ•ďźŒĺŞčŚĺœ¨ćŻä¸€ĺą‚ĺˇŚçŤŻĺťşçŤ‹ä¸€ä¸Şé“žčĄ¨ĺ¤´ďźŒĺ°†ĺŒä¸€ĺą‚的节炚横ĺ‘串č”辡ćĽďźŒäťŽä¸Šĺˆ°ä¸‹é历铞襨头数睄尹ĺŻäťĽäş†ă€‚ä˝†č€ƒč™‘äťĽä¸‹ĺ‡ ç‚šďźš
čż™äšŸčŻ´ć˜ŽćˇąĺşŚäź˜ĺ…ˆéĺŽ†çŹŹäşŒä¸Şäź˜ç‚šďźŒĺŽƒçš„ĺŽžçŽ°ĺŻšäşŽć•°ćŽçť“ćž„ćœŹčşŤć˜Żéžäžľĺ…Ľĺźçš„。
ĺ…śĺŽžčż™ć˜Żä¸€ä¸Şč§äťč§ć™şçš„é—Žé˘˜ă€‚é€’ĺ˝’čż˜ć˜Żéžé€’ĺ˝’ďźŒä¸čż‡ć˜Żä¸¤ç§ä¸ĺŒçš„é历形ĺźďźŒä¸ĺ˜ĺœ¨çťĺŻšçš„äź˜ĺŠŁďźŒč€Œä¸”ä¸€čˆŹćƒ…ĺ†ľä¸‹ĺŻäťĽç›¸äş’čĄĽĺ……ă€‚ćˆ‘ä¸Şäşşé€‰ć‹Šéžé€’ĺ˝’ĺ‡şäşŽäťĽä¸‹ĺ‡ ç§ĺ› ç´ ďźš
ĺ˝“ç„śäťĽä¸Šĺ› ç´ ĺšśä¸é‡čŚďźŒĺź€ĺżƒĺ°ąĺĽ˝ă€‚
ć—˘ç„śćœŹć–‡čŽ˛çŠśĺĽ—čˇŻďźŒé‚Łäšˆĺš˛č„†çŽ°ĺœ¨ĺ°ąćŠŠĺĽ—čˇŻçť™ĺ‡şćĽĺĽ˝äş†ďźŒäźŞäťŁç 形ĺźďźš
/* 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ć ‘ďźŒć˜ŻçŽĄç†ç˝‘çťœčŠ‚ç‚šďźˆčŽžĺ¤‡ďź‰ç”¨çš„ă€‚çŽ€čŚĺœ°čŽ˛ďźŒĺŽƒĺ…ˇćœ‰ä¸¤é‡ç‰šć€§ďźš
ćˆ‘äťŹä¸éœ€čŚĺ…łĺżƒĺ…ś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+ć ‘ä˝œä¸şĺ¤šĺ‰ć ‘ç¤şčŒƒĺŚ‚ä˝•ć‰“ĺ°ďźŒç‰šĺˆŤć˜ŻĺśĺčŠ‚ç‚šĺ’ŒéžĺśĺčŠ‚ç‚šćœŹčşŤĺŽšäš‰ä¸ĺŒçš„ćƒ…ĺ†ľä¸‹ă€‚äťŽčž“ĺ‡şĺŽžçŽ°ä¸Šćˆ‘äťŹĺ‘çŽ°ďźŒ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交ć˘äş†ä¸€ä¸‹ćŹĄĺşďźŒĺłĺŠĺĺ°ąĺ…ˆäşŽĺˇŚĺŠĺčž“ĺ‡şäş†ďźŒčż™ć ˇä¸€ćĽä˝ ĺ°ąĺŻäťĽćŞç€č„‘č˘‹ç›´č§‚ĺœ°çœ‹äşŒĺ‰ć ‘äş†ďźˆçŹ‘ďź‰ďźŒĺŒć—śćˆ‘äťŹčż˜çŸĽé“ďźŒâ€œçżťč˝Źâ€ä¸€ćŁľäşŒĺ‰ć ‘ć˜Żĺ¤šäšˆĺŽšć˜“ďźˆçŹ‘ďź‰ă€‚
ĺˇĽćŹ˛ĺ–„ĺ…śäş‹ďźŒĺż…ĺ…ˆĺˆŠĺ…śĺ™¨ă€‚ĺŚäźšäş†ć ‘形睓构打ĺ°ĺˇĽĺ…ˇďźŒé’ˆĺŻščż™ć ˇçš„ć•°ćŽçť“ćž„ďźŒĺŞćœ‰ä˝ 写ä¸äş†çš„ďźŒć˛Ąćœ‰ä˝ ĺ†™ä¸ĺŻšçš„ă€‚ćœ€ĺŽçť™ĺ‡şä¸€ä¸Şć€č€ƒé˘˜ďźšĺŚ‚ä˝•ç”¨é€’ĺ˝’ĺ˝˘ĺźĺŽžçŽ°ć‰“ĺ°ć ‘ĺ˝˘çť“ćž„ďźŸďźˆćç¤şďźšĺˆŠç”¨ĺ‚ć•°äź é€’ďź‰
100 čĄŒ C 䝣ç çťˆçŤŻć‰“ĺ°ć ‘ĺ˝˘çť“ćž„ďźŒéŚ–ĺ‘äşŽć–‡çŤ - 䟯äšĺœ¨çşżă€‚