diff --git a/404.html b/404.html
new file mode 100644
index 0000000..95cdacb
--- /dev/null
+++ b/404.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+ 斯人如彩虹
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PrideandPrejudice.png b/PrideandPrejudice.png
new file mode 100644
index 0000000..cda45d3
Binary files /dev/null and b/PrideandPrejudice.png differ
diff --git a/assets/css/0.styles.ece217d8.css b/assets/css/0.styles.ece217d8.css
new file mode 100644
index 0000000..534d0a3
--- /dev/null
+++ b/assets/css/0.styles.ece217d8.css
@@ -0,0 +1,10 @@
+.medium-zoom-overlay{z-index:100}.medium-zoom-overlay~img{z-index:101}html{scroll-behavior:smooth}.back-to-ceiling[data-v-c6073ba8]{background-color:#fff;background-color:var(--background-color);box-shadow:0 1px 6px 0 rgba(0,0,0,.2);box-shadow:var(--box-shadow);position:fixed;display:inline-block;text-align:center;cursor:pointer}.back-to-ceiling[data-v-c6073ba8]::hover{background:#d5dbe7}.back-to-ceiling .icon[data-v-c6073ba8]{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:26px;height:26px;fill:#3eaf7c}.fade-enter-active[data-v-c6073ba8],.fade-leave-active[data-v-c6073ba8]{transition:all .5s}.fade-enter[data-v-c6073ba8],.fade-leave-to[data-v-c6073ba8]{opacity:0;transform:translateY(120px)}#loader-wrapper[data-v-d48f4d20]{height:100vh;width:100vw;background:#fff;background:var(--background-color)}#loader-wrapper .loader-main[data-v-d48f4d20]{position:fixed;width:120px;height:50px;top:45%;left:50%;z-index:555;transform:translate(-50%)}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(2){-webkit-animation:pacman-balls-data-v-d48f4d20 1s linear 0s infinite;animation:pacman-balls-data-v-d48f4d20 1s linear 0s infinite}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(3){-webkit-animation:pacman-balls-data-v-d48f4d20 1s linear .33s infinite;animation:pacman-balls-data-v-d48f4d20 1s linear .33s infinite}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(4){-webkit-animation:pacman-balls-data-v-d48f4d20 1s linear .66s infinite;animation:pacman-balls-data-v-d48f4d20 1s linear .66s infinite}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(5){-webkit-animation:pacman-balls-data-v-d48f4d20 1s linear .99s infinite;animation:pacman-balls-data-v-d48f4d20 1s linear .99s infinite}#loader-wrapper .loader-main div[data-v-d48f4d20]:first-of-type{width:0;height:0;border:25px solid #3eaf7c;border-right-color:transparent;border-radius:25px;-webkit-animation:rotate_pacman_half_up-data-v-d48f4d20 .5s 0s infinite;animation:rotate_pacman_half_up-data-v-d48f4d20 .5s 0s infinite}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(2){width:0;height:0;border:25px solid #3eaf7c;border-right-color:transparent;border-radius:25px;-webkit-animation:rotate_pacman_half_down-data-v-d48f4d20 .5s 0s infinite;animation:rotate_pacman_half_down-data-v-d48f4d20 .5s 0s infinite;margin-top:-50px}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(3),#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(4),#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(5),#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(6){background-color:#3eaf7c;width:15px;height:15px;border-radius:100%;margin:2px;width:10px;height:10px;position:absolute;transform:translateY(-6.25px);top:25px;left:100px}#loader-wrapper .title[data-v-d48f4d20]{margin:8rem auto 2rem;font-size:30px}#loader-wrapper .description[data-v-d48f4d20],#loader-wrapper .title[data-v-d48f4d20]{text-align:center;color:#242424;color:var(--text-color);box-sizing:border-box;padding:0 10px;text-shadow:0 2px 10px rgba(0,0,0,.2)}#loader-wrapper .description[data-v-d48f4d20]{margin:auto;font-size:22px}@-webkit-keyframes pacman-balls-data-v-d48f4d20{75%{opacity:.7}to{transform:translate(-100px,-6.25px)}}@keyframes pacman-balls-data-v-d48f4d20{75%{opacity:.7}to{transform:translate(-100px,-6.25px)}}@-webkit-keyframes rotate_pacman_half_up-data-v-d48f4d20{0%{transform:rotate(270deg)}50%{transform:rotate(1turn)}to{transform:rotate(270deg)}}@keyframes rotate_pacman_half_up-data-v-d48f4d20{0%{transform:rotate(270deg)}50%{transform:rotate(1turn)}to{transform:rotate(270deg)}}@-webkit-keyframes rotate_pacman_half_down-data-v-d48f4d20{0%{transform:rotate(90deg)}50%{transform:rotate(0deg)}to{transform:rotate(90deg)}}@keyframes rotate_pacman_half_down-data-v-d48f4d20{0%{transform:rotate(90deg)}50%{transform:rotate(0deg)}to{transform:rotate(90deg)}}.pagation[data-v-094d08e4]{font-weight:700;text-align:center;color:#888;color:var(--text-color);margin:20px auto 0;background:#f2f2f2;background:var(--background-color)}.pagation .pagation-list[data-v-094d08e4]{font-size:0;line-height:50px;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pagation .pagation-list span[data-v-094d08e4]{font-size:14px}.pagation .pagation-list span.jump[data-v-094d08e4],.pagation .pagation-list span.jumpinp input[data-v-094d08e4]{box-shadow:var(--box-shadow);border:1px solid var(--border-color)!important;border:1px solid #ccc}.pagation .pagation-list span.jump[data-v-094d08e4]{padding:5px 8px;border-radius:4px;cursor:pointer;margin-left:5px}.pagation .pagation-list span.jumpinp input[data-v-094d08e4]{width:55px;height:26px;background-color:var(--background-color);font-size:13px;border-radius:4px;text-align:center;outline:none}.pagation .pagation-list span.bgprimary[data-v-094d08e4]{cursor:default;color:#fff;background:#3eaf7c;border-color:#3eaf7c}.pagation .pagation-list span.ellipsis[data-v-094d08e4]{padding:0 8px}.pagation .pagation-list span.jumppoint[data-v-094d08e4]{margin:0 10px 0 30px}.valine-wrapper #valine.v .vbtn{color:#2c3e50;color:var(--text-color);border:1px solid #eaecef;border-color:var(--border-color)}.valine-wrapper #valine.v .vbtn:hover{color:#3eaf7c;border-color:#3eaf7c}.valine-wrapper #valine.v .vwrap{background:rgba(27,31,35,.05);background:var(--code-color);border:1px solid #eaecef;border-color:var(--border-color)}.valine-wrapper #valine.v .vwrap .vheader .vinput{border-bottom:1px dashed var(--border-color)}.valine-wrapper #valine.v .vwrap .vheader .vinput:focus{border-bottom-color:#3eaf7c}.valine-wrapper #valine.v .vwrap .vheader .vinput:-internal-autofill-selected{background-color:var(--code-color)!important}.valine-wrapper #valine.v .vinfo{padding-left:.6rem}.valine-wrapper #valine.v .vcard .vquote{margin-left:0;border-left:none}.valine-wrapper #valine.v .vcard .vimg{width:2.8rem;height:2.8rem;border-radius:.25rem;border:none}.valine-wrapper #valine.v .vcard .vhead .vnick{color:#3eaf7c}.valine-wrapper #valine.v .vcard .vhead .vnick:before{background:#3eaf7c}.valine-wrapper #valine.v .vh{border-bottom:none}.valine-wrapper #valine.v .vh .vhead .vsys{color:#3eaf7c;color:var(--text-color);background:rgba(27,31,35,.05);background:var(--code-color)}.valine-wrapper #valine.v .vh .vmeta{margin-bottom:1rem}.valine-wrapper #valine.v .vh .vmeta .vat{margin-right:.3rem;background:rgba(27,31,35,.05);background:var(--code-color);border-radius:.25rem;padding:0 .4rem;color:var(--text-color);border:1px solid #eaecef;border-color:var(--border-color)}.valine-wrapper #valine.v .vh .vmeta .vat:hover{color:#3eaf7c;border-color:#3eaf7c}.valine-wrapper #valine.v .vh .vcontent{background:rgba(27,31,35,.05);background:var(--code-color);border-radius:.25rem;margin:0 .3rem;padding:.1rem .6rem .05rem}.valine-wrapper #valine.v .vh .vcontent p .at{color:#3eaf7c}.valine-wrapper #valine.v .vh .vcontent.expand:before{z-index:1;background:linear-gradient(180deg,hsla(0,0%,100%,0),#fff);background:linear-gradient(180deg,hsla(0,0%,100%,0),var(--background-color))}.valine-wrapper #valine.v .vh .vcontent.expand:after{color:#3eaf7c;color:var(--text-color);background:#fff;background:var(--background-color)}.valine-wrapper #valine.v .info{padding-right:.6rem}.valine-wrapper #valine.v .vbtn,.valine-wrapper #valine.v code,.valine-wrapper #valine.v pre{background:var(--background-color);color:var(--text-color)}.valine-wrapper #valine.v a{color:#3eaf7c}.valine-wrapper #valine.v a:before{background:#3eaf7c}
+
+/*!
+ * vssue - A vue-powered issue-based comment plugin
+ *
+ * @version v1.4.8
+ * @link https://vssue.js.org
+ * @license MIT
+ * @copyright 2018-2021 meteorlxy
+ */.vssue{color:#2c3e50}@media screen and (max-width:576px){.vssue .vssue-new-comment .vssue-new-comment-body{margin-left:60px}}@media screen and (min-width:577px){.vssue .vssue-new-comment .vssue-new-comment-body{margin-left:70px}}@media screen and (max-width:576px){.vssue .vssue-new-comment .vssue-new-comment-footer{text-align:center}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-new-comment-operations{margin-top:10px}}@media screen and (min-width:577px){.vssue .vssue-new-comment .vssue-new-comment-footer{margin-left:70px;text-align:right}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-current-user{float:left}}@media screen and (max-width:576px){.vssue .vssue-comments .vssue-comment .vssue-comment-body{margin-left:60px}}@media screen and (min-width:577px){.vssue .vssue-comments .vssue-comment .vssue-comment-body{margin-left:70px}}@media screen and (max-width:576px){.vssue .vssue-pagination{flex-direction:column;justify-content:center;text-align:center}}@media screen and (max-width:576px){.vssue .vssue-pagination .vssue-pagination-page{margin-top:10px}}@media screen and (min-width:577px){.vssue .vssue-pagination .vssue-pagination-page{text-align:right}}.markdown-body .tab-size[data-tab-size="1"]{-o-tab-size:1}.markdown-body .tab-size[data-tab-size="2"]{-o-tab-size:2}.markdown-body .tab-size[data-tab-size="3"]{-o-tab-size:3}.markdown-body .tab-size[data-tab-size="4"]{-o-tab-size:4}.markdown-body .tab-size[data-tab-size="5"]{-o-tab-size:5}.markdown-body .tab-size[data-tab-size="6"]{-o-tab-size:6}.markdown-body .tab-size[data-tab-size="7"]{-o-tab-size:7}.markdown-body .tab-size[data-tab-size="8"]{-o-tab-size:8}.markdown-body .tab-size[data-tab-size="9"]{-o-tab-size:9}.markdown-body .tab-size[data-tab-size="10"]{-o-tab-size:10}.markdown-body .tab-size[data-tab-size="11"]{-o-tab-size:11}.markdown-body .tab-size[data-tab-size="12"]{-o-tab-size:12}@font-face{font-family:octicons-link;src:url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format("woff")}.markdown-body .octicon{display:inline-block;fill:currentColor;vertical-align:text-bottom}.markdown-body .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.markdown-body .anchor:focus{outline:none}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;color:#24292e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body .pl-c{color:#6a737d}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:#005cc5}.markdown-body .pl-e,.markdown-body .pl-en{color:#6f42c1}.markdown-body .pl-s .pl-s1,.markdown-body .pl-smi{color:#24292e}.markdown-body .pl-ent{color:#22863a}.markdown-body .pl-k{color:#d73a49}.markdown-body .pl-pds,.markdown-body .pl-s,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre{color:#032f62}.markdown-body .pl-smw,.markdown-body .pl-v{color:#e36209}.markdown-body .pl-bu{color:#b31d28}.markdown-body .pl-ii{background-color:#b31d28;color:#fafbfc}.markdown-body .pl-c2{background-color:#d73a49;color:#fafbfc}.markdown-body .pl-c2:before{content:"^M"}.markdown-body .pl-sr .pl-cce{color:#22863a;font-weight:700}.markdown-body .pl-ml{color:#735c0f}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{color:#005cc5;font-weight:700}.markdown-body .pl-mi{color:#24292e;font-style:italic}.markdown-body .pl-mb{color:#24292e;font-weight:700}.markdown-body .pl-md{background-color:#ffeef0;color:#b31d28}.markdown-body .pl-mi1{background-color:#f0fff4;color:#22863a}.markdown-body .pl-mc{background-color:#ffebda;color:#e36209}.markdown-body .pl-mi2{background-color:#005cc5;color:#f6f8fa}.markdown-body .pl-mdr{color:#6f42c1;font-weight:700}.markdown-body .pl-ba{color:#586069}.markdown-body .pl-sg{color:#959da5}.markdown-body .pl-corl{color:#032f62;text-decoration:underline}.markdown-body details{display:block}.markdown-body summary{display:list-item}.markdown-body a{background-color:transparent}.markdown-body a:active,.markdown-body a:hover{outline-width:0}.markdown-body strong{font-weight:inherit;font-weight:bolder}.markdown-body h1{margin:.67em 0}.markdown-body img{border-style:none}.markdown-body code,.markdown-body kbd,.markdown-body pre{font-family:monospace,monospace;font-size:1em}.markdown-body hr{box-sizing:content-box;overflow:visible}.markdown-body input{font:inherit;margin:0;overflow:visible}.markdown-body [type=checkbox]{box-sizing:border-box;padding:0}.markdown-body *{box-sizing:border-box}.markdown-body input{font-family:inherit;font-size:inherit;line-height:inherit}.markdown-body a{color:#0366d6;text-decoration:none}.markdown-body a:hover{text-decoration:underline}.markdown-body strong{font-weight:600}.markdown-body hr{background:transparent;border-bottom:1px solid #dfe2e5;height:0;margin:15px 0;overflow:hidden}.markdown-body hr:after,.markdown-body hr:before{content:"";display:table}.markdown-body hr:after{clear:both}.markdown-body table{border-collapse:collapse;border-spacing:0}.markdown-body td,.markdown-body th{padding:0}.markdown-body details summary{cursor:pointer}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-bottom:0;margin-top:0}.markdown-body h1{font-size:32px}.markdown-body h1,.markdown-body h2{font-weight:600}.markdown-body h2{font-size:24px}.markdown-body h3{font-size:20px}.markdown-body h3,.markdown-body h4{font-weight:600}.markdown-body h4{font-size:16px}.markdown-body h5{font-size:14px}.markdown-body h5,.markdown-body h6{font-weight:600}.markdown-body h6{font-size:12px}.markdown-body p{margin-bottom:10px;margin-top:0}.markdown-body blockquote{margin:0}.markdown-body ol,.markdown-body ul{margin-bottom:0;margin-top:0;padding-left:0}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ol ol,.markdown-body ol ul ol,.markdown-body ul ol ol,.markdown-body ul ul ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body code,.markdown-body pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px}.markdown-body pre{margin-bottom:0;margin-top:0}.markdown-body input::-webkit-inner-spin-button,.markdown-body input::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}.markdown-body .border{border:1px solid #e1e4e8!important}.markdown-body .border-0{border:0!important}.markdown-body .border-bottom{border-bottom:1px solid #e1e4e8!important}.markdown-body .rounded-1{border-radius:3px!important}.markdown-body .bg-white{background-color:#fff!important}.markdown-body .bg-gray-light{background-color:#fafbfc!important}.markdown-body .text-gray-light{color:#6a737d!important}.markdown-body .mb-0{margin-bottom:0!important}.markdown-body .my-2{margin-bottom:8px!important;margin-top:8px!important}.markdown-body .py-0{padding-bottom:0!important;padding-top:0!important}.markdown-body .py-2{padding-bottom:8px!important;padding-top:8px!important}.markdown-body .pl-3,.markdown-body .px-3{padding-left:16px!important}.markdown-body .px-3{padding-right:16px!important}.markdown-body .f6{font-size:12px!important}.markdown-body .lh-condensed{line-height:1.25!important}.markdown-body .text-bold{font-weight:600!important}.markdown-body:after,.markdown-body:before{content:"";display:table}.markdown-body:after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-bottom:16px;margin-top:0}.markdown-body hr{background-color:#e1e4e8;border:0;height:.25em;margin:24px 0;padding:0}.markdown-body blockquote{border-left:.25em solid #dfe2e5;color:#6a737d;padding:0 1em}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd{border:1px solid #c6cbd1;border-bottom-color:#959da5;box-shadow:inset 0 -1px 0 #959da5;font-size:11px}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-weight:600;line-height:1.25;margin-bottom:16px;margin-top:24px}.markdown-body h1{font-size:2em}.markdown-body h1,.markdown-body h2{border-bottom:1px solid #eaecef;padding-bottom:.3em}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{color:#6a737d;font-size:.85em}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-bottom:0;margin-top:0}.markdown-body li{word-wrap:break-all}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{font-size:1em;font-style:italic;font-weight:600;margin-top:16px;padding:0}.markdown-body dl dd{margin-bottom:16px;padding:0 16px}.markdown-body table{display:block;overflow:auto;width:100%}.markdown-body table th{font-weight:600}.markdown-body table td,.markdown-body table th{border:1px solid #dfe2e5;padding:6px 13px}.markdown-body table tr{background-color:#fff;border-top:1px solid #c6cbd1}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body img{background-color:#fff;box-sizing:content-box;max-width:100%}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body code{background-color:rgba(27,31,35,.05);border-radius:3px;font-size:85%;margin:0;padding:.2em .4em}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{background:transparent;border:0;font-size:100%;margin:0;padding:0;white-space:pre;word-break:normal}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{background-color:#f6f8fa;border-radius:3px;font-size:85%;line-height:1.45;overflow:auto;padding:16px}.markdown-body pre code{background-color:transparent;border:0;display:inline;line-height:inherit;margin:0;max-width:auto;overflow:visible;padding:0;word-wrap:normal}.markdown-body .commit-tease-sha{color:#444d56;display:inline-block;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:90%}.markdown-body .blob-wrapper{border-bottom-left-radius:3px;border-bottom-right-radius:3px;overflow-x:auto;overflow-y:hidden}.markdown-body .blob-wrapper-embedded{max-height:240px;overflow-y:auto}.markdown-body .blob-num{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;color:rgba(27,31,35,.3);cursor:pointer;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px;line-height:20px;min-width:50px;padding-left:10px;padding-right:10px;text-align:right;user-select:none;vertical-align:top;white-space:nowrap;width:1%}.markdown-body .blob-num:hover{color:rgba(27,31,35,.6)}.markdown-body .blob-num:before{content:attr(data-line-number)}.markdown-body .blob-code{line-height:20px;padding-left:10px;padding-right:10px;position:relative;vertical-align:top}.markdown-body .blob-code-inner{color:#24292e;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px;overflow:visible;white-space:pre;word-wrap:normal}.markdown-body .pl-token.active,.markdown-body .pl-token:hover{background:#ffea7f;cursor:pointer}.markdown-body kbd{background-color:#fafbfc;border:1px solid #d1d5da;border-bottom-color:#c6cbd1;border-radius:3px;box-shadow:inset 0 -1px 0 #c6cbd1;color:#444d56;display:inline-block;font:11px SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;line-height:10px;padding:3px 5px;vertical-align:middle}.markdown-body :checked+.radio-label{border-color:#0366d6;position:relative;z-index:1}.markdown-body .tab-size[data-tab-size="1"]{-moz-tab-size:1;tab-size:1}.markdown-body .tab-size[data-tab-size="2"]{-moz-tab-size:2;tab-size:2}.markdown-body .tab-size[data-tab-size="3"]{-moz-tab-size:3;tab-size:3}.markdown-body .tab-size[data-tab-size="4"]{-moz-tab-size:4;tab-size:4}.markdown-body .tab-size[data-tab-size="5"]{-moz-tab-size:5;tab-size:5}.markdown-body .tab-size[data-tab-size="6"]{-moz-tab-size:6;tab-size:6}.markdown-body .tab-size[data-tab-size="7"]{-moz-tab-size:7;tab-size:7}.markdown-body .tab-size[data-tab-size="8"]{-moz-tab-size:8;tab-size:8}.markdown-body .tab-size[data-tab-size="9"]{-moz-tab-size:9;tab-size:9}.markdown-body .tab-size[data-tab-size="10"]{-moz-tab-size:10;tab-size:10}.markdown-body .tab-size[data-tab-size="11"]{-moz-tab-size:11;tab-size:11}.markdown-body .tab-size[data-tab-size="12"]{-moz-tab-size:12;tab-size:12}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item+.task-list-item{margin-top:3px}.markdown-body .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}.markdown-body hr{border-bottom-color:#eee}.markdown-body .pl-0{padding-left:0!important}.markdown-body .pl-1{padding-left:4px!important}.markdown-body .pl-2{padding-left:8px!important}.markdown-body .pl-3{padding-left:16px!important}.markdown-body .pl-4{padding-left:24px!important}.markdown-body .pl-5{padding-left:32px!important}.markdown-body .pl-6{padding-left:40px!important}.markdown-body .pl-7{padding-left:48px!important}.markdown-body .pl-8{padding-left:64px!important}.markdown-body .pl-9{padding-left:80px!important}.markdown-body .pl-10{padding-left:96px!important}.markdown-body .pl-11{padding-left:112px!important}.markdown-body .pl-12{padding-left:128px!important}.clearfix:after,.vssue .vssue-new-comment .vssue-new-comment-footer:after{display:block;clear:both;content:""}.vssue{width:100%;color:#242424;font-size:16px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;padding:10px}.vssue .vssue-button{outline:none;cursor:pointer;padding:10px 20px;font-size:1.05;font-weight:700;color:#3eaf7c;background-color:transparent;border:2px solid #3eaf7c;border-radius:10px}.vssue .vssue-button:disabled{cursor:not-allowed;color:#eaecef;border-color:#eaecef}.vssue .vssue-button:disabled .vssue-icon{fill:#eaecef}.vssue .vssue-button:not(:disabled).vssue-button-default{color:#a3aab1;border-color:#a3aab1}.vssue .vssue-button:not(:disabled).vssue-button-primary{color:#3eaf7c;border-color:#3eaf7c}.vssue .vssue-icon{width:1em;height:1em;vertical-align:-.15em;fill:#3eaf7c;overflow:hidden}.vssue .vssue-icon-loading{-webkit-animation:vssue-keyframe-rotation 1s linear infinite;animation:vssue-keyframe-rotation 1s linear infinite}@-webkit-keyframes vssue-keyframe-rotation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes vssue-keyframe-rotation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.vssue .fade-appear-active,.vssue .fade-enter-active{transition:all .3s ease}.vssue .fade-leave-active{transition:all .3s cubic-bezier(1,.5,.8,1)}.vssue .fade-appear,.vssue .fade-enter,.vssue .fade-leave-to{opacity:0}.vssue .vssue-notice{position:relative;z-index:100;transform:translateY(-11px)}.vssue .vssue-notice .vssue-alert{position:absolute;z-index:101;cursor:pointer;top:0;padding:10px 20px;width:100%;color:#3eaf7c;border:2px solid #c3ead8;border-radius:5px;background-color:#f5fbf8}.vssue .vssue-notice .vssue-progress{position:absolute;top:0;left:0;height:2px;background-color:#3eaf7c}.vssue .vssue-status{text-align:center;padding-top:20px;padding-bottom:10px;color:#3eaf7c}.vssue .vssue-status .vssue-icon{font-size:1.4em}.vssue .vssue-status .vssue-status-info{margin-top:10px;margin-bottom:10px}.vssue .vssue-header{padding-bottom:10px;border-bottom:1px solid #eaecef;margin-bottom:10px;overflow:hidden}.vssue .vssue-header .vssue-header-powered-by{float:right}.vssue .vssue-new-comment{border-bottom:1px solid #eaecef;margin-top:10px;margin-bottom:10px}.vssue .vssue-new-comment .vssue-comment-avatar{float:left;width:50px;height:50px}.vssue .vssue-new-comment .vssue-comment-avatar img{width:50px;height:50px}.vssue .vssue-new-comment .vssue-comment-avatar .vssue-icon{cursor:pointer;padding:5px;font-size:50px;fill:#757f8a}.vssue .vssue-new-comment .vssue-new-comment-body{position:relative}@media screen and (max-width:719px){.vssue .vssue-new-comment .vssue-new-comment-body{margin-left:60px}}@media screen and (min-width:720px){.vssue .vssue-new-comment .vssue-new-comment-body{margin-left:70px}}.vssue .vssue-new-comment .vssue-new-comment-body .vssue-new-comment-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.vssue .vssue-new-comment .vssue-new-comment-footer{margin-top:10px;margin-bottom:10px}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-current-user{color:#a3aab1}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-current-user .vssue-logout{cursor:pointer;text-decoration:underline;color:#a3aab1;font-weight:400}@media screen and (max-width:719px){.vssue .vssue-new-comment .vssue-new-comment-footer{text-align:center}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-new-comment-operations{margin-top:10px}}@media screen and (min-width:720px){.vssue .vssue-new-comment .vssue-new-comment-footer{margin-left:70px;text-align:right}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-current-user{float:left}}.vssue .vssue-new-comment .vssue-new-comment-input{resize:none;outline:none;width:100%;padding:15px;font-size:16px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;background-color:#f5fbf8;border:1px solid #eaecef;border-radius:5px}.vssue .vssue-new-comment .vssue-new-comment-input:disabled{cursor:not-allowed;background-color:#f0f2f4}.vssue .vssue-new-comment .vssue-new-comment-input:focus{background-color:#fff;border-color:#9adbbe;box-shadow:0 0 1px 1px #9adbbe}.vssue .vssue-new-comment .vssue-new-comment-input::-moz-placeholder{color:#a3aab1}.vssue .vssue-new-comment .vssue-new-comment-input:-ms-input-placeholder{color:#a3aab1}.vssue .vssue-new-comment .vssue-new-comment-input::placeholder{color:#a3aab1}.vssue .vssue-comments .vssue-comment{margin:15px 0}.vssue .vssue-comments .vssue-comment.vssue-comment-edit-mode .vssue-comment-main{border-color:#9adbbe;box-shadow:0 0 1px 1px #9adbbe}.vssue .vssue-comments .vssue-comment.vssue-comment-disabled{pointer-events:none}.vssue .vssue-comments .vssue-comment.vssue-comment-disabled .vssue-comment-body{background-color:#f9f9fa}.vssue .vssue-comments .vssue-comment .vssue-comment-avatar{float:left;width:50px;height:50px}.vssue .vssue-comments .vssue-comment .vssue-comment-avatar img{width:50px;height:50px}@media screen and (max-width:719px){.vssue .vssue-comments .vssue-comment .vssue-comment-body{margin-left:60px}}@media screen and (min-width:720px){.vssue .vssue-comments .vssue-comment .vssue-comment-body{margin-left:70px}}.vssue .vssue-comments .vssue-comment .vssue-comment-header{padding:10px 15px;overflow:hidden;border-top-left-radius:5px;border-top-right-radius:5px;border:1px solid #eaecef;border-bottom:none}.vssue .vssue-comments .vssue-comment .vssue-comment-header .vssue-comment-created-at{float:right;cursor:default;color:#a3aab1}.vssue .vssue-comments .vssue-comment .vssue-comment-main{padding:15px;border:1px solid #eaecef}.vssue .vssue-comments .vssue-comment .vssue-comment-main .vssue-edit-comment-input{resize:none;outline:none;border:none;width:100%;background:transparent}.vssue .vssue-comments .vssue-comment .vssue-comment-footer{padding:10px 15px;overflow:hidden;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border:1px solid #eaecef;border-top:none}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-hint{cursor:default;color:#a3aab1}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-reactions .vssue-comment-reaction{cursor:pointer;display:inline-block;margin-right:8px;color:#3eaf7c}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-operations{float:right;color:#3eaf7c}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-operations .vssue-comment-operation{cursor:pointer;margin-left:8px}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-operations .vssue-comment-operation.vssue-comment-operation-muted{color:#a3aab1}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-operations .vssue-comment-operation.vssue-comment-operation-muted .vssue-icon{fill:#a3aab1}.vssue .vssue-pagination{cursor:default;display:flex;padding:5px;color:#a3aab1}@media screen and (max-width:719px){.vssue .vssue-pagination{flex-direction:column;justify-content:center;text-align:center}}.vssue .vssue-pagination .vssue-pagination-loading,.vssue .vssue-pagination .vssue-pagination-page,.vssue .vssue-pagination .vssue-pagination-per-page{flex:1}@media screen and (max-width:719px){.vssue .vssue-pagination .vssue-pagination-page{margin-top:10px}}@media screen and (min-width:720px){.vssue .vssue-pagination .vssue-pagination-page{text-align:right}}.vssue .vssue-pagination .vssue-pagination-select{outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid #9adbbe;padding-left:.2rem;padding-right:1rem;background-color:transparent;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg class='icon' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cstyle/%3E%3C/defs%3E%3Cpath d='M676.395 432.896a21.333 21.333 0 0 0-30.166 0L511.061 568.021 377.728 434.645a21.333 21.333 0 0 0-30.165 30.166l148.394 148.48a21.419 21.419 0 0 0 30.208 0l150.23-150.187a21.333 21.333 0 0 0 0-30.208'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:100%}.vssue .vssue-pagination .vssue-pagination-select:disabled{cursor:not-allowed}.vssue .vssue-pagination .vssue-pagination-select:focus{background-color:#fff;box-shadow:0 0 .2px .2px #9adbbe}.vssue .vssue-pagination .vssue-pagination-link{display:inline-block;min-width:1em;text-align:center}.vssue .vssue-pagination .vssue-pagination-link.disabled{pointer-events:none}.vssue .vssue-pagination .vssue-pagination-link:not(.disabled){color:#3eaf7c;font-weight:500;cursor:pointer}.vssue,.vssue *{box-sizing:border-box}.vssue :not(.vssue-comment-content) a{cursor:pointer;font-weight:500;color:#3eaf7c;text-decoration:none}.vssue :not(.vssue-comment-content) hr{display:block;height:1px;border:0;border-top:1px solid #eaecef;margin:1.2rem 0;padding:0}.vssue-wrapper.vssue{color:#2c3e50;color:var(--text-color)}.vssue-wrapper.vssue .vssue-new-comment{border-bottom:1px solid #eaecef;border-bottom:1px solid var(--border-color)}.vssue-wrapper.vssue .vssue-new-comment .vssue-new-comment-input:disabled{background-color:#fff;background-color:var(--background-color);border:1px solid #eaecef;border:1px solid var(--border-color)}.vssue-wrapper.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-current-user{color:#2c3e50;color:var(--text-color)}.vssue-wrapper.vssue .vssue-header{border-bottom:1px solid #eaecef;border-bottom:1px solid var(--border-color)}.vssue-wrapper.vssue .vssue-comments .vssue-pagination .vssue-pagination-per-page .vssue-pagination-select{color:var(--text-color)}.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-footer,.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-header,.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-main{border:none}.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-footer,.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-main{background:var(--code-color)}.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-footer{border-top:2px solid var(--background-color)}.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-avatar img{width:2.8rem;height:2.8rem;border-radius:.25rem}.vssue-wrapper.vssue .markdown-body{color:var(--text-color)}#nprogress{pointer-events:none}#nprogress .bar{background:#3eaf7c;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #3eaf7c,0 0 5px #3eaf7c;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#3eaf7c transparent transparent #3eaf7c;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto}.home .hero{text-align:center}.home .hero h1{display:block;font-size:2.5rem;color:var(--text-color)}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{font-size:1.6rem;line-height:1.3;color:var(--text-color)}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#3eaf7c;padding:.2rem 1.2rem;border-radius:.25rem;transition:background-color .1s ease;box-sizing:border-box}.home .hero .action-button:hover{background-color:#4abf8a}.home .features{border-top:1px solid var(--border-color);padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%;transition:all .5s;color:var(--text-color)}.home .feature h2{font-size:1.6rem;font-weight:500;border-bottom:none;padding-bottom:0}.home .feature:hover{transform:scale(1.05)}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.badge[data-v-08862138]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:.25rem;padding:0 6px;color:#fff}.badge.green[data-v-08862138],.badge.tip[data-v-08862138],.badge[data-v-08862138]{background-color:#42b983}.badge.error[data-v-08862138]{background-color:#da5961}.badge.warn[data-v-08862138],.badge.warning[data-v-08862138],.badge.yellow[data-v-08862138]{background-color:#e7c000}.badge+.badge[data-v-08862138]{margin-left:5px}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box .iconfont{position:absolute;top:0;bottom:0;z-index:0;left:.6rem;margin:auto}.search-box input{cursor:text;width:10rem;height:2rem;color:#5b5b5b;display:inline-block;border:1px solid var(--border-color);border-radius:.25rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:transparent;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#3eaf7c}.search-box .suggestions{background:var(--background-color);width:20rem;position:absolute;top:1.5rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:var(--text-color)}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:var(--border-color)}.search-box .suggestion.focused a{color:#3eaf7c}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box{margin-right:0}.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title{display:block}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid var(--border-color);padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #3eaf7c;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid var(--text-color-sub);border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:var(--background-color);padding:.6rem 0;box-shadow:var(--box-shadow);text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:var(--text-color)}.nav-links a.router-link-active,.nav-links a.router-link-active .iconfont,.nav-links a:hover,.nav-links a:hover .iconfont{color:#3eaf7c}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px}}.mode-options{background-color:var(--background-color);min-width:125px;margin:0;padding:1em;box-shadow:var(--box-shadow);border-radius:.25rem}.mode-options .title{margin-top:0;margin-bottom:.6rem;font-weight:700;color:var(--text-color)}.mode-options .color-mode-options{display:flex;flex-wrap:wrap}.mode-options .color-mode-options li{flex:1;text-align:center;font-size:12px;color:var(--text-color);line-height:18px;padding:3px 6px;border-top:1px solid #666;border-bottom:1px solid #666;background-color:var(--background-color);cursor:pointer}.mode-options .color-mode-options li.dark{border-radius:.25rem 0 0 .25rem;border-left:1px solid #666}.mode-options .color-mode-options li.light{border-radius:0 .25rem .25rem 0;border-right:1px solid #666}.mode-options .color-mode-options li.active{background-color:#3eaf7c;color:#fff}.mode-options .color-mode-options li:not(.active){border-right:1px solid #666}.color-picker{position:relative;margin-right:1em;cursor:pointer}.color-picker .color-button{align-items:center;height:100%}.color-picker .color-button .iconfont{font-size:1.4rem;color:#3eaf7c}.color-picker .color-picker-menu{position:absolute;top:40px;left:50%;z-index:150}.color-picker .color-picker-menu ul{list-style-type:none;margin:0;padding:0}@media (max-width:719px){.color-picker{margin-right:1rem}.color-picker .color-picker-menu{left:calc(50% - 35px)}.color-picker .color-picker-menu:before{left:calc(50% + 35px)}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem;box-shadow:var(--box-shadow);background:var(--background-color)}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:50%}.navbar .site-name{font-size:1.2rem;font-weight:600;color:var(--text-color);position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex;background-color:var(--background-color)}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:.2rem}}.tags[data-v-285c9a44]{margin:30px 0}.tags span[data-v-285c9a44]{vertical-align:middle;margin:4px 4px 10px;padding:4px 8px;display:inline-block;cursor:pointer;border-radius:.25rem;background:#fff;color:#fff;line-height:13px;font-size:13px;box-shadow:var(--box-shadow);transition:all .5s}.tags span[data-v-285c9a44]:hover{transform:scale(1.04)}.tags span.active[data-v-285c9a44]{transform:scale(1.2)}.friend-link-wrapper[data-v-165dc218]{position:relative;margin:30px 0}.friend-link-wrapper .friend-link-item[data-v-165dc218]{position:relative;vertical-align:middle;margin:4px 4px 10px;padding:4px 8px 4px 20px;line-height:20px;display:inline-block;cursor:default;border-radius:.25rem;font-size:13px;box-shadow:var(--box-shadow);transition:all .5s}.friend-link-wrapper .friend-link-item .list-style[data-v-165dc218]{position:absolute;left:.4rem;top:0;bottom:0;margin:auto;display:block;width:.4rem;height:.4rem;border-radius:.1rem;background:#3eaf7c;content:""}.friend-link-wrapper .friend-link-item .popup-window-wrapper[data-v-165dc218]{display:none}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window[data-v-165dc218]{position:absolute;display:flex;background:var(--background-color);box-shadow:var(--box-shadow);border-radius:.25rem;box-sizing:border-box;padding:.8rem 1rem;width:280px}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .logo[data-v-165dc218]{margin-right:.4rem;width:2rem;height:2rem;flex:0 0 2rem;border-radius:.25rem;overflow:hidden}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .logo img[data-v-165dc218]{width:2rem;height:2rem}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .info[data-v-165dc218]{flex:0 0 85%;width:85%}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .info .title[data-v-165dc218]{display:flex;align-items:center;justify-content:space-between;height:2rem}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .info .title h4[data-v-165dc218]{margin:.2rem 0;flex:0 0 86%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .info .title .btn-go[data-v-165dc218]{width:1.4rem;height:1.2rem;border-radius:.25rem;font-size:12px;color:#fff;text-align:center;line-height:1.2rem;cursor:pointer;transition:all .5s}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .info .title .btn-go[data-v-165dc218]:hover{transform:scale(1.1)}.fade-enter-active[data-v-165dc218],.fade-leave-active[data-v-165dc218]{transition:opacity .5s}.fade-enter[data-v-165dc218],.fade-leave-to[data-v-165dc218]{opacity:0}.iconfont[data-v-f875f3fc]{display:inline-block;line-height:1.5rem}.iconfont[data-v-f875f3fc]:not(:last-child){margin-right:1rem}.iconfont span[data-v-f875f3fc]{margin-left:.5rem}.tags .tag-item[data-v-f875f3fc]{font-family:Ubuntu,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;cursor:pointer}.tags .tag-item.active[data-v-f875f3fc],.tags .tag-item[data-v-f875f3fc]:hover{color:#3eaf7c}@media (max-width:719px){.tags[data-v-f875f3fc]{display:block;margin-left:0!important}}.abstract-item[data-v-ff2c8be0]{position:relative;margin:0 auto 20px;padding:16px 20px;width:100%;overflow:hidden;border-radius:.25rem;box-shadow:var(--box-shadow);box-sizing:border-box;transition:all .3s;background-color:var(--background-color);cursor:pointer}.abstract-item>[data-v-ff2c8be0]{pointer-events:auto}.abstract-item .reco-sticky[data-v-ff2c8be0]{position:absolute;top:0;left:0;display:inline-block;color:#3eaf7c;font-size:2.4rem}.abstract-item[data-v-ff2c8be0]:hover{box-shadow:var(--box-shadow-hover)}.abstract-item .title[data-v-ff2c8be0]{position:relative;font-size:1.28rem;line-height:46px;display:inline-block}.abstract-item .title a[data-v-ff2c8be0]{color:var(--text-color)}.abstract-item .title .reco-lock[data-v-ff2c8be0]{font-size:1.28rem;color:#3eaf7c}.abstract-item .title[data-v-ff2c8be0]:after{content:"";position:absolute;width:100%;height:2px;bottom:0;left:0;background-color:#3eaf7c;visibility:hidden;transform:scaleX(0);transition:.3s ease-in-out}.abstract-item .title:hover a[data-v-ff2c8be0]{color:#3eaf7c}.abstract-item .title[data-v-ff2c8be0]:hover:after{visibility:visible;transform:scaleX(1)}.abstract-item .tags .tag-item.active[data-v-ff2c8be0],.abstract-item .tags .tag-item[data-v-ff2c8be0]:hover{color:#3eaf7c}@media (max-width:719px){.tags[data-v-ff2c8be0]{display:block;margin-top:1rem;margin-left:0!important}}.sidebar-group{background:var(--background-color)}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:var(--text-color)}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{position:relative;color:var(--text-color);transition:color .15s ease;cursor:pointer;font-size:1em;font-weight:500;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0}.sidebar-heading.open,.sidebar-heading:hover{color:#3eaf7c}.sidebar-heading .arrow{position:absolute;top:0;bottom:0;right:1em;margin:auto}.sidebar-heading.clickable.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-heading.clickable:hover{color:#3eaf7c}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.abstract-wrapper[data-v-6cc0658a]{width:100%}.personal-info-wrapper .personal-img[data-v-39576ba9]{display:block;margin:2rem auto 1rem;width:6rem;height:6rem;border-radius:50%}.personal-info-wrapper .name[data-v-39576ba9]{font-size:1rem;text-align:center;color:var(--text-color)}.personal-info-wrapper .num[data-v-39576ba9]{display:flex;margin:0 auto 1rem;width:80%}.personal-info-wrapper .num>div[data-v-39576ba9]{text-align:center;flex:0 0 50%}.personal-info-wrapper .num>div[data-v-39576ba9]:first-child{border-right:1px solid #333}.personal-info-wrapper .num>div h3[data-v-39576ba9]{line-height:auto;margin:0 0 .6rem;color:var(--text-color)}.personal-info-wrapper .num>div h6[data-v-39576ba9]{line-height:auto;color:var(--text-color);margin:0}.personal-info-wrapper .social-links[data-v-39576ba9]{box-sizing:border-box;display:flex;flex-wrap:wrap;padding:10px}.personal-info-wrapper .social-links .social-item[data-v-39576ba9]{width:39px;height:36px;line-height:36px;text-align:center;list-style:none;transition:transform .3s}.personal-info-wrapper .social-links .social-item[data-v-39576ba9]:hover{transform:scale(1.08)}.personal-info-wrapper .social-links .social-item i[data-v-39576ba9]{cursor:pointer;font-size:22px}.home-blog{padding:0;margin:0 auto}.home-blog .hero{margin:3.6rem auto 0;position:relative;box-sizing:border-box;padding:0 20px;height:100vh;display:flex;align-items:center;justify-content:center}.home-blog .hero .hero-img{max-width:300px;margin:0 auto 1.5rem}.home-blog .hero h1{display:block;margin:0 auto 1.8rem;font-size:2.5rem}.home-blog .hero .description{margin:1.8rem auto;font-size:1.6rem;line-height:1.3}.home-blog .home-blog-wrapper{display:flex;align-items:flex-start;margin:20px auto 0;padding:0 20px;max-width:1126px}.home-blog .home-blog-wrapper .blog-list{flex:auto;width:0}.home-blog .home-blog-wrapper .blog-list .abstract-wrapper .abstract-item:last-child{margin-bottom:0}.home-blog .home-blog-wrapper .info-wrapper{position:-webkit-sticky;position:sticky;top:70px;overflow:hidden;transition:all .3s;margin-left:15px;flex:0 0 300px;height:auto;box-shadow:var(--box-shadow);border-radius:.25rem;box-sizing:border-box;padding:0 15px;background:var(--background-color)}.home-blog .home-blog-wrapper .info-wrapper:hover{box-shadow:var(--box-shadow-hover)}.home-blog .home-blog-wrapper .info-wrapper h4{color:var(--text-color)}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper{list-style:none;padding-left:0}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper .category-item{margin-bottom:.4rem;padding:.4rem .8rem;transition:all .5s;border-radius:.25rem;box-shadow:var(--box-shadow);background-color:var(--background-color)}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper .category-item:hover{transform:scale(1.04)}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper .category-item:hover a{color:#3eaf7c}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper .category-item a{display:flex;justify-content:space-between;align-items:center;color:var(--text-color)}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper .category-item a .post-num{width:1.6rem;height:1.6rem;text-align:center;line-height:1.6rem;border-radius:.25rem;background:#eee;font-size:13px;color:#fff}@media (max-width:719px){.home-blog .hero{height:450px}.home-blog .hero img{max-height:210px;margin:2rem auto 1.2rem}.home-blog .hero h1{margin:0 auto 1.8rem;font-size:2rem}.home-blog .hero .description{font-size:1.2rem}.home-blog .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home-blog .home-blog-wrapper{display:block!important}.home-blog .home-blog-wrapper .blog-list{width:auto}.home-blog .home-blog-wrapper .info-wrapper{margin-left:0}.home-blog .home-blog-wrapper .info-wrapper .personal-info-wrapper{display:none}}@media (max-width:419px){.home-blog .hero{height:450px}.home-blog .hero img{max-height:210px;margin:2rem auto 1.2rem}.home-blog .hero h1{margin:0 auto 1.8rem;font-size:2rem}.home-blog .hero .description{font-size:1.2rem}.home-blog .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home-blog .home-blog-wrapper{display:block!important}.home-blog .home-blog-wrapper .blog-list{width:auto}.home-blog .home-blog-wrapper .info-wrapper{margin-left:0}.home-blog .home-blog-wrapper .info-wrapper .personal-info-wrapper{display:none}}.sub-sidebar-wrapper[data-v-cb1513f6]{width:12rem;padding-left:0;list-style:none;font-size:12px}.sub-sidebar-wrapper li[data-v-cb1513f6]{padding:.2rem 0;cursor:pointer;border-left:1px solid var(--border-color)}.sub-sidebar-wrapper li a[data-v-cb1513f6]{padding:.35rem 1rem .35rem 0;color:var(--text-color)}.sub-sidebar-wrapper li:hover a[data-v-cb1513f6]{color:#3eaf7c}.sub-sidebar-wrapper li.active[data-v-cb1513f6]{border-left:1px solid #3eaf7c}.sub-sidebar-wrapper li.active a[data-v-cb1513f6]{color:#3eaf7c}.sub-sidebar-wrapper li.level-1[data-v-cb1513f6]{padding-left:.4rem}.sub-sidebar-wrapper li.level-2[data-v-cb1513f6]{padding-left:.9rem}.sub-sidebar-wrapper li.level-3[data-v-cb1513f6]{padding-left:1.5rem}.page-nav,.page .comments-wrapper,.page .page-edit{max-width:860px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav,.page .comments-wrapper,.page .page-edit{padding:2rem}}@media (max-width:419px){.page-nav,.page .comments-wrapper,.page .page-edit{padding:1.5rem}}.page{position:relative;padding-top:5rem;padding-bottom:2rem;padding-right:14rem;display:block}.page .side-bar{position:fixed;top:10rem;bottom:10rem;right:2rem;overflow-y:scroll}.page .side-bar::-webkit-scrollbar{width:0;height:0}.page .page-title{max-width:860px;margin:0 auto;padding:1rem 2.5rem;color:var(--text-color)}.page .theme-reco-content h2{position:relative;padding-left:.8rem}.page .theme-reco-content h2:before{position:absolute;left:0;top:3.5rem;display:block;height:1.8rem;content:"";border-left:5px solid #3eaf7c}.page .page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page .page-edit .edit-link{display:inline-block}.page .page-edit .edit-link a{color:#3eaf7c;margin-right:.25rem}.page .page-edit .last-updated{float:right;font-size:.9em}.page .page-edit .last-updated .prefix{font-weight:500;color:#3eaf7c}.page .page-edit .last-updated .time{font-weight:400;color:#aaa}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid var(--border-color);padding-top:1rem;overflow:auto}.page-nav .next{float:right}@media (max-width:719px){.page{padding-right:0}.page .side-bar{display:none}.page .page-title{padding:0 1rem}.page .page-edit .edit-link{margin-bottom:.5rem}.page .page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.footer-wrapper[data-v-c3cf170c]{padding:1.5rem 2.5rem;border-top:1px solid var(--border-color);text-align:center;color:#5b5b5b}.footer-wrapper a[data-v-c3cf170c]{font-size:14px}.footer-wrapper>span[data-v-c3cf170c]{margin-left:1rem}.footer-wrapper>span>i[data-v-c3cf170c]{margin-right:.5rem}.footer-wrapper .cyber-security img[data-v-c3cf170c]{margin-right:.5rem;width:20px;height:20px;vertical-align:middle}.footer-wrapper .cyber-security a[data-v-c3cf170c]{vertical-align:middle}@media (max-width:719px){.footer[data-v-c3cf170c]{text-align:left!important}.footer>span[data-v-c3cf170c]{display:block;margin-left:0;line-height:2rem}}.sidebar .sidebar-sub-headers{padding-left:1.5rem;font-size:.95em}.sidebar-sub-headers a.sidebar-link{margin:0 1rem 0 .6rem}a.sidebar-link{font-size:1em;font-weight:400;display:block!important;color:var(--text-color);padding:.35rem 1rem .35rem 2.25rem;line-height:1.7;background:var(--background-color);box-sizing:border-box}a.sidebar-link:hover{color:#3eaf7c}a.sidebar-link.active{font-weight:600;color:#3eaf7c;background:var(--default-color-8);border-right:3px solid #3eaf7c}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500;background:transparent;color:#3eaf7c}.sidebar.sidebar::-webkit-scrollbar{width:0;height:0}.sidebar .personal-info-wrapper{display:none}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar ul.sidebar-links>li{background:#3eaf7c}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid var(--border-color);padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1em;line-height:1.7;font-weight:500}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links,.sidebar .personal-info-wrapper{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}.password-shadow[data-v-25ba6db2]{overflow:hidden;position:relative;background:#fff;background:var(--background-color);box-sizing:border-box}.password-shadow .title[data-v-25ba6db2]{margin:8rem auto 2rem;width:100%;font-size:30px}.password-shadow .description[data-v-25ba6db2],.password-shadow .title[data-v-25ba6db2]{text-align:center;box-sizing:border-box;text-shadow:0 2px 4px rgba(0,0,0,.1);color:#242424;color:var(--text-color)}.password-shadow .description[data-v-25ba6db2]{margin:0 auto 6rem;font-size:22px;padding:0 10px}.password-shadow .inputBox[data-v-25ba6db2]{position:absolute;top:40%;left:0;right:0;margin:auto;display:block;max-width:700px;height:100px;background:#3eaf7c;border-radius:.25rem;padding-left:20px;box-sizing:border-box;opacity:.9}.password-shadow .inputBox input[data-v-25ba6db2]{width:570px;height:100%;border:none;padding:0 0 0 5px;color:#fff;background:none;outline:none;position:absolute;bottom:0;left:20px;opacity:0;font-size:50px}.password-shadow .inputBox input[data-v-25ba6db2]:focus{opacity:1}.password-shadow .inputBox input:focus~span[data-v-25ba6db2]{transform:translateY(-80px);color:#3eaf7c;font-size:30px;opacity:.8}.password-shadow .inputBox input:focus~button[data-v-25ba6db2]{opacity:1;width:100px}.password-shadow .inputBox span[data-v-25ba6db2]{width:200px;height:100%;display:block;position:absolute;line-height:100px;top:0;left:20px;color:#fff;cursor:text;transition:.5s;transform-origin:left top;font-size:30px}.password-shadow .inputBox button[data-v-25ba6db2]{overflow:hidden;width:0;height:98px;border-radius:.25rem;position:absolute;background:var(--background-color);right:1px;top:1px;border:0;padding:0;color:#3eaf7c;font-size:18px;outline:none;cursor:pointer;opacity:0;transition:.5s;z-index:1}.password-shadow .footer[data-v-25ba6db2]{position:absolute;left:0;right:0;bottom:10%;padding:2.5rem;text-align:center;color:#5b5b5b}.password-shadow .footer>span[data-v-25ba6db2]{margin-left:1rem}.password-shadow .footer>span>i[data-v-25ba6db2]{margin-right:.5rem}@media (max-width:719px){.password-shadow .inputBox[data-v-25ba6db2]{max-width:700px;height:60px;background:#3eaf7c;border-radius:.25rem;position:absolute;left:0;right:0;top:43%;margin:auto 20px;padding-left:0;box-sizing:border-box;opacity:.9}.password-shadow .inputBox input[data-v-25ba6db2]{width:60%;height:100%;border:none;padding:0 0 0 5px;color:#fff;background:none;outline:none;position:absolute;bottom:0;opacity:0;font-size:30px}.password-shadow .inputBox input[data-v-25ba6db2]:focus{opacity:1}.password-shadow .inputBox input:focus~span[data-v-25ba6db2]{transform:translateY(-60px);color:#3eaf7c;font-size:20px;opacity:.8}.password-shadow .inputBox input:focus~button[data-v-25ba6db2]{opacity:1;width:60px}.password-shadow .inputBox span[data-v-25ba6db2]{width:200px;height:100%;display:block;position:absolute;line-height:60px;top:0;left:20px;color:#fff;cursor:text;transition:.5s;transform-origin:left top;font-size:20px}.password-shadow .inputBox button[data-v-25ba6db2]{width:0;height:58px;border-radius:.25rem;position:absolute;right:1px;top:1px;border:0;padding:0;background:#fff;color:#3eaf7c;font-size:18px;outline:none;cursor:pointer;opacity:0;transition:.5s;z-index:1}.password-shadow .footer[data-v-25ba6db2]{margin-left:0}}@media (max-width:959px){.password-shadow .footer[data-v-25ba6db2]{margin-left:0}}.theme-container .loading-wrapper[data-v-1aefc0b4]{position:absolute;z-index:22;top:0;bottom:0;left:0;right:0;margin:auto}.theme-container .password-wrapper-out[data-v-1aefc0b4]{position:absolute;z-index:21;top:0;bottom:0;left:0;right:0;margin:auto}.theme-container .password-wrapper-in[data-v-1aefc0b4]{position:absolute;z-index:8;top:0;bottom:0;left:0;right:0}.theme-container .hide[data-v-1aefc0b4]{height:100vh;overflow:hidden;opacity:0}.fade-enter-active[data-v-1aefc0b4],.fade-leave-active[data-v-1aefc0b4]{transition:opacity .5s ease-in-out .5s}.fade-enter[data-v-1aefc0b4],.fade-leave-to[data-v-1aefc0b4]{opacity:0}@font-face{font-family:iconfont;src:url(data:font/woff2;base64,d09GMgABAAAAACcIAAsAAAAARPAAACa6AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACKegrvONktATYCJAOBZAt0AAQgBYRnB4QOG604RaTdtJfiZP8fDugB82cnpUAl0ZGsRjJLjaLz7uhxFXN2ZOvr79/nQ9vQlsfQdlhwYIL57VuYrybm6PdDKXkefu3beTNfbMX8ryOe8ERJpE2URqJUIiWQCFnTRXR4fm7/5967DEZvrBmMGIwesaakR46UsRESreh/UiIiRoPPeJiA2YCJXzGywagXC4A2P3+HXwABBLn77T7wUDKLIGkLrEAC4J+qadm9EOi2d1N1A5JlWJAsW1rM2XwAMOA9HezyISTxp7vy66n8eqYFhgOJzbTIA4FXKq9s6fT0aMUvAyuANKXtRMvW23mZaqU6zi0Tw5Q23vptr7vAApSA5AiRvP//dJat5CPu7sIHCv4At4A9V+WMtDQaL0iLWoXsQ1kHkjdgb8iHWIUAPIvWoeQNSEE7BFzmpSKsrijqABVlnz66ibgowOCca6phdf0xpuk5fkypdQ1CeEMEI4o7artvj4KeMw9UD/WTDIByVVBXARw12EctxActVyWWAoB7rNQgDCg6ZS3apTaYF4Im1Wt4DABv/He+/AK+BQdUmjWwb9KLlzoTGHkJfViztVn9EYyyS4GWKzRRYyhYVfWBPLy8B0hoDtV6uOc6qvQAHlNCawWBR8LEISQmISXjJ5SWgVGuyUrMMDeFLGY5917+07iZev163s//v0vf7P/DZQ0EjYiCzWLr7rzJKWh2p0XT9LZbLx6LkcwgVz7a+mQmZsVKd3uFmv8oD9gwsGTRvOu2TFswal/LulPjZnTc0HXpwpS2ngm3nLlmU9O5STfVRuxadWTNnKFjy1bsGFMpZm07dGJPw4E+pQXgwAOo3hljbxHIATYIDAwIAiwRNLBIMMA8wQLXCQ7YInhgmhCBBUISjBJgn1CBFqEB64QOnBKGjBRmAjBD2ECHcIAbRAh0iRi4JBLggrjLWIWlALSJN9AjMmCCyCWZhf1ARgorQJYPhwKwSTRAk2iBc2IAJokRuElygZpMBkaIBdglxcAqKQGOSBOwRqYDc2QGMCRzgWOyEVgmB4AVcgjYIZeBMfIPUPENkvlhLihmIWwCxTaEXwNwyPd5wAk/3wB7/EoHGvybDRzwf/gQ+uC2u4RXgK8ATD4Cc8/tqvLWqNRcEfSiRslNlbaG2rG3VTqm3H0asCZNBZZoRLEMEXrBmkK8d6rdIjZUAAVSQRlc1jsjbnPaE6rIS+p5G6dJTVqVOXsQUpvy92EjrBrbTZnFUcovjVlU07yvVkUvyILIWjbGTjE15IcmTH7iWTjjLN7XRyfYxvk1j7tt3nIJ34N8WKtypUr2W/+WyR96N+o6rjsVXdHtrRvHa+xjkx0FhQujRkY5Z6PlBdrWHLZVCZQ23j66QcCb1yVGymsWkDq3fWU/TfOECSL9/ppFOX2lI5tI5Y48a11IOFRYsh0rWPGSKiyDlFmV1qyKHjwoJt1gbVW/y9RJxarRKmJ5yXC4pM25bVW2BkhF5oB4nhUEkCqiZhLN9f7M8PtTM+hv6d6Iz5jrkp8N1PdPUEj3/do847+y8MIVhNhzlzquuUeG9vwMANn7S9O09/L885cxtl682n0zeHR0/2/wOPN9GgSW5xHXTYl0N5LyOQ0bp3axe2AHuY93Ww/hztEH7xtIQyl87DP6AO1iZVLBu3eIzIY7Bx30J1YGBPzVLnj7rJKaqtPQe7tTInuCU4n7W/shcwGmyRq21gFpk9wpADCkk/FNdRJSf+CyoiTcfFHH7szA7XT2JsY0CyENXt3pLe/oNABE4hK2bl8NtpGpa2eBAPmFqzA3scKWxsh4il64w25tAVCv/fGRv2CAITYMUA8Hd7FrU2AHmb4uoMPNWbiTztz4C2IbdBOLcWSyZsbbxL2MulB9ax/ttu6D4ydHH2rbmoW1/ThXPiPjsUJcoAAl9UwQueu/k9hI3Olb6Zh7zH3t1gc2kTQu1/NBNYVlJDydNDe7VztjevmxWz1e73L3Yr+uk642Z4rh5NPyS5o5JfdrotpBR5QKiZLR70dmbZpRbcj+9oOdlnheGWzNzPTB9+wBfWjdJ/fqEXOgH8Tw4iAV2NORTjjGyQakvBdYzX2EAbFxKWYJCJiDxVlqLSmoUn0n4QgZW7pDFlIHMYNx8AnGesYwcgoUtDb0ApOBwzubSeU2TuR1XbZljvHCASAYFz60MLbaM2AHacsrmpLIiqolS1h4xXUtxfMsJQgszfc/vvFoR5fhSCz7QiUjaacGeF5CxZFIitZKhcyQrnV0EeyGUx2tLVaElIdVssAqsAosbKlnwTCN5OB2zKkDnWhoeIFRkRRCjum5fKlqsyOwVRKRCFKFU2RcGtqKSoDYIq6WZNsDBKEzNjEvqhBqJFUXtu1CzMJ4m8QRCmfeI7atipvJmsA43HQxI5ul2KLDL14YzTlFhKT0VpTzAWBa8RKDkhodRyGs03keIYhDnJvArxxknFLCNbVqQGltlL/Ud+o4SLMIdZVzvVUAgLguqmNFuJ0GQY6vkLJ5TvfANmJLQaTF47MJiStOJDfSeuWlap5KT0+/fv35y2bwavDkZMtoYuKFouKoQs1NtDLlilmMctmO2YWMlM4UVAFHL3Q5SJ/wX4DFaD7EMzIuxK3r69OApCWYTLRL6qh/6PQlP7iA8/Luus8ZxWtbocx4ZT4u8GLQkp2oLkR17iiQCmHLBHCu8ariQFGTReW1uXQ5ZctNbzo3ThFvjj5skCfRALYAaE2z5L3RfZIF9gKJr3OpHM1HeVRiCDHY0GzsG2mmaimOhQ0IyIR1EB/tLFSO+kY8boFw6otMUZr9XMy+bssGup6RZWJagEnrzIGGwNgCMthbWEknsMPkrs6BvLAuxxfNXVEtuTPYjuiUtX4+jjG/j+iASD8fGOu59dxc60KfsnJoZv9vj07214JOQADoDFsbl9K/tC9KH8/V1UmYwiQMM+HxXrkSs9Vqm56vgfmwPSSle7gk4T1IFRExmazVFMdBjEdwwq84OVXU4mL+uH1UnhamiTVkOBh/ARDQmzTni+7Zi/SZZyjGB8dF8jC2iEueftpG6NAEP3CgDuLxmO69yy8uJkuTIw1Oa3opomIH45IuVJPKuCAXKkMrbdMcGQwpV56ba8sPx5RQk22bS3seFbtaG+WykbjIZR8QUURUgUtkhnxKw6YQKhYMHO2QFsIto5HRia5iR/5z9rVgCmstNjijaglbsViLUlR8tzE9fh0XulVL1H3Kmv9WaKYua4amm68fP3ns7Jtnzr3+GXTmpPTwPAcOeqFGWx0m8XRGd/IjxVZSRVbn/rHLVfPqa3ufdbVqLY3r2VEU35gJ3nxoBp53VEbstVtHpo6GT1zsC4zbspzhfX1R1/CfuLBvJAheDF6+7nmNU3wu9gNeTQwdKFTI0iXErrTm3YwrkNbi1eZ0WXGCwzk1CA1D60un0g6Peyq3GLQNbUcQQ3p4E2OwhbnUOAD4s9TZxMX9kLz0ykLf/ItXk75RiC8kqvsKseJM80jk/suePnJ4Muicb1/sH+pZjKfbuGKomPY/CwpMrDipINSBdYhLSEyHXE3iJVXlra21YC+EeIhLELsHQmNtY69JXLbji/Ha4dlH9Sks2waj7beW1DZ81MTbB5D2Z7Qdn6sHdaJLpmRKpmb4xwtLTvCzEp7ZBXG2wWloePW8jnMtk5GXeagcmpjl4/c63pbYCszWjqXTobEDBknWkpORXAPX6bHxrLws2+2FUPpEeilRPmEw861O0VFhbykuVNR0VoKBr+F0FAMEdAe7pB7C+kuH0h3XjLnEIt+RSE7FUhoQOYMhgvhQzSzX2cLuwNrhnKtYl4pytXu2KYlZD1v+lNmK3TS81zuJymMIQ7EznrZkO9yOotFEgl7V0XMiL+bufrldf4pLHZck1Gyqh4X63HOoGZtXVdpsdGMdx+Mq0CSud0QN/CLWTVXcGwXpykUKsc7+mlAg0i5JPC0VWyFVTSowP0zLNPHeniVZx00dm1c8cUZf69DTPCvRloGYjzjWo8hA7LkOqdnEUI2rGBBbNUsYN0maTMJNJlXUwN1C1ClUehaCdALlyxKXQeR5H27CuZvYOrgOzpYqpIxYMUtzJV2hJ7ldsn+OLZtw9BSl4kydq+L63IxG3JxZ6V3GVrwGqTJdPXTKSqKamID0zbvY6rzcC7Sqj9gSidmdsevty+EKINotxPwn4BfUTOWRacUM+uYmtl6mygaxUBroi1hjXd62cxQS29o6oZSd+6RZfpWJnmJLoXu1hBv+vp/dl1zNSfZ+uH6KTHMjzubkH2YQs4Ct1Vk6s/IXni9Wc6VC5Rvmv/MAwkgOxU8G2PJ6V926g5kwmpDD5K177jlezG6kmioPnj7rZNWUUEXr1x6rD6+mbqd/qgZJc3ttanxu4bhMKJIP+SII7cIkD/ZHTlE6ztOyXVBPidwXJ5GaZrOT3sX4VGlxeRz8jpSXFj7CVnfI6FiSZJpivpKWtGERcbI59YokoxhavtVIxQu19BlD+UHDblvTfzk6rnu2gOp/Fls3Iw3Z46ytHBoLDXmvL+u3X74urqx9/4PlVxf7a/3weDgjV8ziGz5Pg3R4HUwudBYCyF7xz93lWBDkoaHG9Ogek4mtCjNomd0fnGGaG11yuTeDKKuHZcaA2ezp5c7r3aXkRq7pk7S9ci57KJuoKuypDliyK9vBm0H/3eA7wynmeTqzVSbmYoCTcdKX//vHCY/iENq9l66xV268s91uY9DapBtsjawbQVfUVWt0zvovIC5CO8WSdaZZQ8z/e/DXv1lesAH45y/e477BevI9vTymLPQVE9OjZc49UL3T0Qk9gekbkAbu9Mliu91ekQvxUsto80hiy8YsNqYB8f5WbONt5abtaLF5JEhOBi+WmjKNxE0hMr5srU7SvdbMJ1JTus40ii51XEPMuLPXxIqtzrdPPRFJ4/kRQld2sI3al63+kioKhxnbIIVGduXNXpYkyKV0vZxXGhoAVRSniJjkIAkiRdc0Tij3L6jbcOGRN6ak4u024k1BB8lTW81J0eEz9swF+uzF2ZviPehJnj4PTu6ZF0YgpX1Ea4opKhy3a85AIjLoMIm5CUiTLbl4Iddmn5TrXK+uH02Yo5AajjHCHyD3Dlp04AhOrWP3zaJ32Nrv//DIH/+CdqIddTt3/1UzbgmbclwmwDrGp/S/LUO1CM5NI7Bu4md1oG6UiHf5RyZlM44NOsrMoQ1Qcmr0gn+rceC9EfVhNR0zsnfcrfCxuTU5MpoyYU8P1wvV7AP128m/FPQhUIUK4dyVlarS7KwU1Zv6eXM06fuQvuubJa8iX7WeF7Ug5h25D4irrQNAhohh4+A/sBnrfOYGGRRy8iqx2K9ZtYFGhFUZLpusqsDDZ6SaralnVAKSlUxCr4/1UyQSH2yA+g842gWrEP7YQgFgb5f83ZrL/CeuuS4nIp1o4lN7+/7x1i1oaSYepBuojq2BbWRdOke3CU+mt2vndp3yMGicdBbYnHS6HOJyBmPLLlanYz/+iEuWZuF2eq8+NiKU7OmpSxQO5zxVwODx/FLb6TJpP1Oxkudqk5HUTy3u0YHypSsbv/62uYyMnj7W91fhDz6Bzws0eBkCeXxCKp4/tixVlrpsjI9fns7sFaOa04zwyfI/iQPfl/480X4XZ56JxewVDYgHmKScrAp7mQnhrzoeb/+CIec7MKSvPCneEQkVnq3lnsoEb5rilfMeqCm0WFFUpCgO/UokNOic9dfnRGC1c9NJJLpkIpUnh9mtXYGjVrhK39JjY+nbd9dUeFVM3j30POCt1LUQO2Bo9+QhNbu382LSiKecvaQsDQ8vbSZSeXNo7tlkZ/VCFnDqbfyddW6Rv5rCh4RrLcCfwqNZmdDJGR4zLmFg4uHHKYpNT+GDvIqaz8qn7t1HxbBsqb0gFPHjwg0kOhmBcUw+x0QtJXIIk545C++e9eVGSoDzc2CNaLKEmhQKU6jlK5DQHL0l9GvuH6tmb0yaITZOinHyFOh5DqxpquClEnwc3j6A/GawxSc8QR/fxrrneV/63uM++B3zncO9wcnhXee4cDA5GJ8whcUrPiLMorj6NcKdjiEEcjjc6y45wlscrUMxo1PYySjeIRNaemS9vbL+0T9EcdeirsWJjBTA6tFpA+htFRcUF4pnz35WrR3VAt/1EQZu5XfuQu73Sm4YcbmGVbR4Bc+hm+P58ns/fnTg+/AdtMobilgC3f7D/VcJEkHvvTGRSjj8OR9UxMdv93ahWjQmUgu37321YQM4Npmyx91ocwI/ixSfKHOvrHzMhqpUXZ/Oc6JX7fMbj/RGPi4M3CrYqtdU9rP5R7X6w0Kd9pzgvF67RdAhGNNoxgQ6XXov+kHBbDCm1w3yV+SG+3VDvyqvT4H9I7T1rw9e9sps9w1186fP2Lh5jH9uq+Bob89KuS/0P88L3n65ywcRm8be3i2CwTFwbn8SvVdA/2uwh+8yMtgr8O1NVRZpNUuWyxMUr9X6VdTB8xP9IABRjkgaJU53i5UmooeCqcOfx6PjE9vbE+PR+KN4HeE+YQo6OygzICAzKBs9hXDhlA4/hkd3aKs1lRWaGm0HOilS5KYJqfKZIuvv957iU4k0ES6AR/5QAUaL2TmClWMobDriw5tSjgAapkaD0z44D+Q2StiVi5FjqGy0HF2eBqLc7pKzoCqAEqCAAXFgkJ0dMLhxHFbvoyktk2Plfho5Ru6r09M1MA89gl5uVFis/c6Wky7hP6WVV136PV56cQuHGQekr8JcgOxZs7O6QqmsUAvZUSuU6lSa0xVHBcfYnnPmHDNXcxZe3yg3TjJX5M+ocDLmXqbYfi14HGnBr979Lfs62DWH7blNsLXC9vGNKLMwd+Z1zfknCFhnFue6GsXz5omNrrmXec3FxnnzjOJc18uYhPrWI7t3F/HF9ivtYv+CiM3ZvTMfAy9fYS08QFfaU65qOj5BE3YO8jIaf2N8jDvsvou5rnPeLxeq6x6JTxa9UJhEgAX8rnKDxFFwY+P50j6obXEYISplIT1gVFM/iy8QizuvUvE85Tcvmu8+qo1hlaPDK+wj2N2xZVEWDUlPQ21yY7AEzgFHymdJqp27iiA/biJcewuUB7tGluCPXDckiYLDO+w4oZhWp1mBs4BYPtpY5mmR9vVJLZ5lHw0JzTlbpGWeHzGO9DYUQQAEFOI46RTJSnrBYT5LpJL6/HzT0nz81ujMzuCg/Pyg4DlEQNID6aQ8zgSStQl/PYrNcUcWLDgSF50B13xTtx1W7yd2Fca61f3Bj7dR21+emP/rrBYbjf2/xjnueUcv22eSEIsuz7KNOtSOkilLNLUuWa6h8vHR317MDfxZ9xiGbfp87EaQlRSAgC/wswCHvsUIoLO1nSlsAs8FOJ7sa8EGHsAksRad2F/ioA7Bx/tG5/o2UkscX56Qg3z5fpfnj7NhCsJ6W66Uoa+qlF4IfCebS8xLXI6GsT0j/Q2DIHSnNvxJDQfA1I7xp1UcCAZmcNkDRagMoAuXQmjHPD1dWG8ozpUYRd23zXVHRbmSy5hJSAPD67n9KB2FClDWRiCITllSDSMq1NN+6t6QQzc79ZOvXnkCY1AIggqiL53q0wxBd49APjSMVkC1QavgRDBzzg0XWipJWQOhUYHk6QTMwsdCbEIUVr1MjeahCIuxKbZEPGJ3FUH8J6JtnkF0QFqmxLggaEqUc9uzq3ZHpfZvgeHBn3soe903m5b85MQTBI2GN7GsUVUF6OfOc6A/pEY5QonjC+acdiFHUuJrJtCIq7YJ9F+X/bCJgbjBySgfFL6nmMSh+kPBzE1BgLwsEcNBuSEBLlJZZBRnCDs7hRli4zmxURWdnecxG8XnjKfImV1Sg6NkNjDgKBjh8JwY1BOwb8CVHt35jeNweeu5LzFUrTOWGqVfdkZ5bubtKaKt7lOSBrsdwO0GEg/oD/oj/IV7r7EqvJLmklxJlnhet/TV7qz+OFtQlHvJsWm4/1cI1+weOltkLoCPoshLZo7f3GAfy3qDRa9PrcDR9vK0Qbmn+Ff+YjLsMAkRVRKXmaNSHk8yPAJiEd/OoZ5fBsj8SdK9AWAFTBRTCLm68mR0F5pYDGtK4MgMSCJRq2lJauyTI1PO71/aaj1T0+ehcDm+BndGa2LLYJQAEczFkHEGbCIlcZGNgnksoFpJSpgPQdxBizCJwnQfvVNwpqDV460ykUGAmGrNemKaTfmbo0eCNjR0nLjuaOjALfrrL/UTtIC+K4A8G8VXUkawshWDtrgodiA3D8v/IdwDt2C6EeVE62UWOq0mft2dSiF1QhV52XehCjHJ5hqPjbKV6xbCyRCW3tDTrDaZDr1LUseH1qfp07T1uWN/ZdomaAwesz78KdPrRddPb9NBjA4csJ2+61qo4+apvYvDI3+6OdfZt92ad7+t88Dm0YHGJoXEUISe0j9nm5fh+lW42gfvyirh4fos2WgDy56lBko3W1W5uDV3cRI5ktQlLsxwDmclfH9+7gFVuSAFAiZ/xzxWN1OusYlk4vOpljH8xNvFMzVNUaIinqxKSGCb/mPedq53re15grmR2Njvorgk5E5xd5zBFV6S0in9loSX3yfWfVx8cNt2KFHdWZGgBurKOtRsKGlNWzAuvjev6moUd4euqt3dl5v9VUzuuP9kKmcpNRUatf6zeFJmpb+NxM2OFmACvKAHAeYccaa4q0uU6ZozRiQ0sUxxjnjM4OdyYl7cae5KzN7loCRtw5+5JlSfbNWD0QSv3+k4h7glGy82rWE8yI+9A5DfUXFqYQpqm543SVi/dK14/2iZ6VgVfUsff8ndvLuAGub2BzQD1sCFjSSKxANzuXbzIsKufa+HnpbRVDxljEjVRrM7b6hRwovQ7QfNCgewgpQub/XHnJIwoKQqWWH3eOBSu+kLFGEUlDrb8uqKcKvzhJ8xU1Ez4X9EES0DzPYBYPruVO/Ue2Ta1tcSEmJSmD8TqYEpxKL4bM5xoZ1Cfxo1K2r6xj3HT+iuD16/uQTntX7ahrIXz2sY9rqS9onYzrMVNyNWNbf+k1Txwg44Uuw93MhO/4UlCBJXenFyg+He86XXG04syrxDhyaJsmZlDtwtZZPxhyxh+9dT3gWyfGjciY0v6WJTs+TVqlIPNy7vI1ZXwSjxFd9tGnHNC8lbwROqY7psg0WFdbY/ZyJqSCYHk3RukG0cQYCn+LVxTHn3DStHo/gxfoyyF8NRiBZub7rluAWZZKNqunR2wfd9solNqY6v/5wWE0ikCWVZTFgX2MQIGkfFhdTOQ95ilK9p4jDxW/1gExQd/Qeh9Ij7P64outqyxb/YPaYTc7gZo1MS55tKY93eoLWkfMYhIC3FG8T2NgPo9uuLJUXMqd3dQeglQQa0HSEoBbXnxKIzFbj7mSk7eTaSI9cOwmhKHO2uunvL3CUdAOPvmoz4QeYbV5BocjEdt/bCGIihOeuXd3dD6r88uB3pCbMrudeeLLlxk56eT44JPk0mGHCYe6J1+gobLOOZ+ioej4VlMeTTKKzuRCkTR2Zmtthee1zoo8S8onEf7lxQ94ew8/+FO7l1jmBPgoJ0oPC2pyQtFP4Zw5ZfQTQ9BOV79zF7yoxbTq+mh3eFFYYBX7kgQawTbRFrxQlOc1tEOt/774lHbY4SXf3iwlMJCV7zyK7zxCOsI8SLhCM290HT9HfcNhE3Z6ELY2tX8L57AzcWtXwj0TzS/u0p8PtbGknxzmlTsYS8LPmCN4/ewrtZ/1K9spSehy1hZt4zij6ZDLZBmHEpmOr+GCotCH+TEvWGwc8bcXEaeeoJZXDjwdR4GVyZDLrdASAOMYeIwNcwaHSoX2RczIm6G0zCNscLdzwL0+KNyZWC1wlZev0qee0+jMlp8Z6Fdy74P9qk2vTIyT4HKo5M0sZ/SOcQCY0JFefYO+FzoOeulh56RygZeO+Ia6gZUmfNiyUwQprWHreWB6p8Mnhs9qrwUb2+rMdvUwgOiZ2XNaQ+m/niULHj+4ESAggtcDwdnSteXhTy5xPEV0PRyBFLRJZFCV79/wrpANVBJYhm89H+bWyvay4/2Vc92ccGP1fZPy8f/LB//pkMI/E/eysxRfpk/3HOF6KVdHIrdp/cR8S6YTdd6WSMH2D3GHd3MT7tiwMVdaI/vwmwbLozVvCNt1P6dGEzcyqzsuX4W8FvRq1zLUNzxTw83HabYfA4O9zqkbbugU9Vvf+sT1Oz8n0erEuTDrfVVwX/dsC+z1gshDIr5mOcCJFVA0xtjaa8PglFILnvUB1uHl7p3I5hpr6le0Z4Rq0wqkTXse4xmes8ImUx+c30DNnB8Oj8+SACv/Ck1ezyPWYkx0eZw8Tqsm5Yvv831j+FUJDXvJT3e34mbGIB4cqdzYeVODXBjYgk+qSqyvS14wNVhCiULZLioRFMX3Kowu4pvCf1v5dT9xn9HeCcNM8oz7Phc8zWUycCCy3e4PKnB/1NGjMJZ/VVSyPlKa56jwQ/xCzfrRZHd3hEAWKywdDop/2UYrBUVR3mHR4YsCDxo86/QfLQbq09841Z6/WJmhKQ4KnWhDQPT/LNvrRQG+Kh9k8gp7h+ArK+Zk6/sl9xUHmwdoS9RTGI9tlynWPgLC4kipOuXffuBc/6TPO7iwzcuWyHOCduJ3f/f/9NvgRDXdXsaALJK8Lr6sJXpNjR5EqWsMhhsrKO5UIPcS9o/7UIjXI68D6lA9Oq9WKFf1buSuCSQxbgekGNc6VHurqvaXqf+tk2uPVeXuiAV3vn6GmP8LDh7FALY9FcbylRKwfQ05p78R793qaeV6cw2XH4DqTzFnZTPMiat+Vm5+1vA99uD3Qtg45m56G7T91Q4NAZd3cIcJGqDTAn6iwKiTqLJoN5cbfv62ITFjSEG9Tib9HtfTFtbTGJoercF3/PSaXqpdrMyY3njQcyNa58XQov6ltg3v3yC1PzM2VqPQ2E+fIgcOnC3n4HBVnmBCCIOW2Xs/20Za0YjI0wEI9HuDSYBnnbFV65eWMle+XyZZ0tm4xwMJt4l+jphmQtK+i83a5kAyXULDaYVd7RfukcE7+0uJCfzn6tau8GU4KpXhUxfj+3k/nFZSZ+BjvKT+VdpJVY/9NUaVT1XURW1VEdIiRosqWRUrfoTEcoTzOalIKSFIqW8pKi4Wjcoz9N1XxSNsk/4H6pL6QVFoYHmxUlTQK1Q4ZvqtlrmzQrPWvFxwwdqptaxscVqQ5Jt3mZfVMzHNSCJkVJsNnGydUcj/ztGLLbePGXxl3z6+I+OzZW+wM0AwBIiLIZjIDy0wyUQGg0nju3RWOrt4+dURJuVoSaw0p/hpVo3ebQkrCfpWE+FObwkhmx9npbzaFz5wVtvIxYabS7e7Q0dhcR0KBz1rueM2cCEIDYDYl8RThhvujetJLM9EacKMSJfG8N+5PpjnRyN+A58kLXPU9I8KsF/J8QoyqrpO3sf4Th4vxIJbkuP5gGq6D/1J8g2Fv1c0GLkkZYYFB++lwvKstThdR7tWtydt4QonKtTzsN1G4awq3wS8TRfWkI2qTpgecqXswP4pgdwo0Mg03P/Vqbypac9EqW0inyeKTjic0LFqw9+0Vlu8tRHzEzPae6tYY5GNYCQRh0Pa5HfoKwuTjxWGfnscTLREKTDgSsexsdnSvOFp41ZNYlS8S5wuyzQEAzWcxTQv/SZgzNuPLB7T7uwhknCo2KgqPy8iMBlc7hTRTBHR2QCUVKPWhLpVPhxWdGlyJUPru38fMu5N07ZBd5sAxwEeXPL1crCgkpIkVbNBGKc0ikCPIcXDLEpPSv/OMd8xCtgWumbe6u+T8XXG1tK5Y0lLrNemxM9KnV6LxSOLHO/8M3ItRoo7/MXjqVV3V6Eo6gq1NpKmdpqrSJrlqVtmqWtvLKdSAE4jppnYCzqGFrZq5GTj6UIDRptLSQ9d9YpVvlWONkPz8ntx5+AOEC3tuxJj6RDTvnx0929CTcxwfyu8xsZmSZ7Ufbg7aPWP/YPvR9f2IB32doHHHRV77R2KhusLGxqBuNRn4CnoTDWhqWbIuzs27kuLY9aY+PgJnW71brP9bmANYhJxG1bh5wDolODziBaAafcw8JqBiRRAXsfUoRhfVNWVDeyFaNfdw6JAIAAJDj8ANt3MGMQbS0vNJy12ZEbA2jOSGkBYp8Ixg1iIzius1UASLC+IXGkaq0VCbVL8SJtGdu8ROpZnXm044iESCxTGU9+LiZiCB2yQXEu4peLTJ2yR1Epvfykj0TtQRpBQAAFIB/aMZaw0gB2M/bh/hb/zXoWxp9oYmqzaceIhxaFgQfAgAAZAU8VTNWcEaadPMHcgixZ91pSkk3FkTqRNKHHZepMWgFkgSDH+tDeIOPeIREjbuhA8H+c0pLYHZBfHceNfQbjvg/LKMeXJ7b7uPuIMG3o48C8CfGoq1CQA4GiWx0MoG7Mql/PRkOQDDqJqfIqbW+iWdegutknfEuiDATTEqFWYJyk9B3iU6e1WLa4/DK+q94kxNpUrp0w0ODwW/ANGAAAAEtAMC/rOzHAA/lUsqkFl2Cey+FHvfBAqdYQAAO8HlUF3cBDYjAV8AAHAgTCEAKdMsmAiaoAgiAUHgAgBi0aQIEaGBAgAEFHBIQQAOjPKrLLQENbMErAQNo4F+BANIgsjsiEOv284siGE7OL46CcGSZ+Rf3J6ZeQIvG/EVthFHu6iXLjv+BjHoJh/ZKN7Pookp1362bhqWIm1XuGOyUzebPs7cZ5/kUpK6+KILh5PjF3TwF4ThrS7/3fmLqBZSS/6tpM0T94jtXJxcK/gdlqkkKktxe6cZ0LTqHqD6uOt8fNSxvpjgz3rhjeNNPcglj/nRGs4q09FR9aR2QFKjdZO3FBxcgQYEGAxY8wL9R+tUBBwQBhBCNJ9PZfLFc5fWNza3tnd29/YPDo+OT07Pzi8ur65vbu/uHx6fnl9e3d4PiNJEdiZtBUqhjAU4dEh49me/hgbaN8NwVCY+hGfXDvOx8kbSrQGWISsjTVlv7iL2UFhSRtzDT4U7ALfd9haXz/o3kZfRUyHE7TNIX4t3rhv92oU083DveSbf6jSGDbZ7PMUJAL/I42JvMUPf/M+X+JasHHgwEweVg0o1AxkL8wIl4nCT0imybFocgOYc0JLIC/qP1lJB3RbiEwolRZMgdeNL2HoX0ug9SRPdiGfUYZF6UUrZ90l5xiwvuGHrqmz5vea5DQ9CQDxVbkxE+A9dYrCJI7n708sClA+8mMDxACNLZxpCwJ9Fll4UVbmR1tQI=) format("woff2"),url(/assets/fonts/iconfont.938fa69e.woff) format("woff"),url(/assets/fonts/iconfont.ecabaf00.ttf) format("truetype")}.iconfont{font-family:iconfont!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reco-reddit:before{content:"\e701"}.reco-instagram:before{content:"\e6fc"}.reco-language:before{content:"\e65e"}.reco-bitbucket:before{content:"\eb57"}.reco-faq:before{content:"\e643"}.reco-lock:before{content:"\e60f"}.reco-sticky:before{content:"\e62b"}.reco-blog:before{content:"\e61d"}.reco-mail:before{content:"\e624"}.reco-friend:before{content:"\e62f"}.reco-rss:before{content:"\f09d"}.reco-fullscreen:before{content:"\e602"}.reco-api:before{content:"\e662"}.reco-jianshu:before{content:"\e60c"}.reco-mayun:before{content:"\e6d0"}.reco-weibo:before{content:"\e612"}.reco-bilibili:before{content:"\e630"}.reco-douyin:before{content:"\e654"}.reco-v2ex:before{content:"\e62a"}.reco-csdn:before{content:"\e609"}.reco-juejin:before{content:"\e613"}.reco-wechat:before{content:"\e720"}.reco-qq:before{content:"\e67b"}.reco-facebook:before{content:"\e606"}.reco-twitter:before{content:"\e60b"}.reco-zhihu:before{content:"\e605"}.reco-douban:before{content:"\e603"}.reco-taobao:before{content:"\e6a5"}.reco-toutiao:before{content:"\e6b7"}.reco-linkedin:before{content:"\e668"}.reco-document:before{content:"\e67a"}.reco-sf:before{content:"\e610"}.reco-coding:before{content:"\e601"}.reco-gitlab:before{content:"\e63c"}.reco-suggestion:before{content:"\e608"}.reco-tongzhi:before{content:"\e764"}.reco-huawei:before{content:"\e6b9"}.reco-beian:before{content:"\e667"}.reco-color:before{content:"\eae9"}.reco-other:before{content:"\e60e"}.reco-copyright:before{content:"\ef87"}.reco-theme:before{content:"\e7e8"}.reco-eye:before{content:"\e669"}.reco-menu:before{content:"\e67c"}.reco-up:before{content:"\e68b"}.reco-npm:before{content:"\e88d"}.reco-search:before{content:"\e611"}.reco-message:before{content:"\e634"}.reco-three:before{content:"\e644"}.reco-github:before{content:"\e628"}.reco-bokeyuan:before{content:"\e626"}.reco-date:before{content:"\e63b"}.reco-account:before{content:"\e607"}.reco-category:before{content:"\e61e"}.reco-home:before{content:"\e65b"}.reco-tag:before{content:"\e633"}.content{margin:4rem auto 0;max-width:800px;padding:0 2rem}.mod_404 .desc .desc_link{display:inline-block;background:#424242!important;color:#fff;padding:6px 20px!important;text-decoration:none!important;border-radius:4px}@media screen and (max-width:720px){.mod_404 .desc{margin:50px 0}.mod_404 .wrapper{margin:0!important;padding-top:20px}}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.categories-wrapper[data-v-1e68bc8d]{max-width:860px;margin:0 auto;padding:4.6rem 2.5rem 0}.categories-wrapper .category-wrapper[data-v-1e68bc8d]{list-style:none;padding-left:0}.categories-wrapper .category-wrapper .category-item[data-v-1e68bc8d]{vertical-align:middle;margin:4px 8px 10px;display:inline-block;cursor:pointer;border-radius:.25rem;font-size:13px;box-shadow:var(--box-shadow);transition:all .5s;background-color:var(--background-color)}.categories-wrapper .category-wrapper .category-item.active[data-v-1e68bc8d],.categories-wrapper .category-wrapper .category-item[data-v-1e68bc8d]:hover{background:#3eaf7c}.categories-wrapper .category-wrapper .category-item.active a span.category-name[data-v-1e68bc8d],.categories-wrapper .category-wrapper .category-item:hover a span.category-name[data-v-1e68bc8d]{color:#fff}.categories-wrapper .category-wrapper .category-item.active a span.category-name .post-num[data-v-1e68bc8d],.categories-wrapper .category-wrapper .category-item:hover a span.category-name .post-num[data-v-1e68bc8d]{color:#3eaf7c}.categories-wrapper .category-wrapper .category-item a[data-v-1e68bc8d]{display:flex;box-sizing:border-box;width:100%;height:100%;padding:8px 14px;justify-content:space-between;align-items:center;color:#666}.categories-wrapper .category-wrapper .category-item a .post-num[data-v-1e68bc8d]{margin-left:4px;width:1.2rem;height:1.2rem;text-align:center;line-height:1.2rem;border-radius:.25rem;font-size:.7rem;color:#fff}@media (max-width:719px){.categories-wrapper[data-v-1e68bc8d]{padding:4.6rem 1rem 0}.page-edit .edit-link[data-v-1e68bc8d]{margin-bottom:.5rem}.page-edit .last-updated[data-v-1e68bc8d]{font-size:.8em;float:none;text-align:left}}.content__default code{color:#505050;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:var(--code-color);border-radius:3px}.content__default code .token.deleted{color:#ec5975}.content__default code .token.inserted{color:#3eaf7c}.content__default pre,.content__default pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.content__default pre[class*=language-] code,.content__default pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:2.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:3.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:2.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number,div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:2.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:var(--code-color);border-color:#67cc86}.custom-block.tip .title{color:#67cc86}.custom-block.warning{background-color:var(--code-color);border-color:#fb9b5f}.custom-block.warning .title{color:#fb9b5f}.custom-block.danger{background-color:var(--code-color);border-color:#f26d6d}.custom-block.danger .title{color:#f26d6d}.custom-block.right{color:rgba(0,0,0,.4);font-size:.9rem;text-align:right}.custom-block.theorem{margin:1rem 0;padding:.1rem 1.5rem;border-radius:.4rem;background-color:var(--code-color)}.custom-block.theorem .title{font-weight:700}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1em 0;padding:1rem;background-color:var(--code-color)}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid var(--text-color-sub)}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid var(--text-color-sub)}.arrow.right{border-left:6px solid var(--text-color-sub)}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid var(--text-color-sub)}.content__default:not(.custom){max-width:860px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.content__default:not(.custom){padding:2rem}}@media (max-width:419px){.content__default:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0}body{font-family:Ubuntu,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:15px;color:var(--text-color);background-color:var(--background-color)}.page,.password-wrapper-in{overflow-x:hidden;margin-left:18rem}.navbar{z-index:20;right:0;height:3.6rem;box-sizing:border-box}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none;background-color:rgba(0,0,0,.65)}.sidebar{font-size:16px;background-color:var(--background-color);width:18rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid var(--border-color);overflow-y:auto}.content__default:not(.custom) a:hover{text-decoration:underline}.content__default:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.content__default:not(.custom) img{max-width:100%}.content__default:not(.custom) :first-child{margin-top:0}.content__default.custom{padding:0;margin:0}.abstract img,.content__default.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#3eaf7c}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:.9rem;color:#999;border-left:.25rem solid #999;background-color:var(--code-color);margin:.5rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.25}.content__default:not(.custom)>h1,.content__default:not(.custom)>h2,.content__default:not(.custom)>h3,.content__default:not(.custom)>h4,.content__default:not(.custom)>h5,.content__default:not(.custom)>h6{margin-top:-1.5rem;padding-top:3.6rem;margin-bottom:1rem}.content__default:not(.custom)>h1:first-child,.content__default:not(.custom)>h2:first-child,.content__default:not(.custom)>h3:first-child,.content__default:not(.custom)>h4:first-child,.content__default:not(.custom)>h5:first-child,.content__default:not(.custom)>h6:first-child{margin-top:-3.5rem}h1{font-size:1.6rem}h2{font-size:1.4rem}h3{font-size:1.2rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:2.2}hr{border:0;border-top:1px solid var(--border-color)}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid var(--border-color)}tr:nth-child(2n){background-color:var(--code-color)}td,th{border:1px solid var(--border-color);padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .content__default:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page,.theme-container.no-sidebar .password-wrapper-in{margin-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:14.76rem}.page,.password-wrapper-in{margin-left:14.76rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page,.password-wrapper-in{margin-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}.password-shadow{padding-left:0}}@media (max-width:419px){h1{font-size:1.9rem}.content__default div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.iconfont{font-family:iconfont,Ubuntu,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif!important;font-size:13px;color:var(--text-color-sub)}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-thumb:vertical{height:5px;background-color:#3eaf7c}::-webkit-scrollbar-thumb:horizontal{width:5px;background-color:#3eaf7c}.vuepress-flowchart{overflow:auto}.sw-update-popup{border-radius:.25rem!important;box-shadow:var(--box-shadow)!important;color:var(--text-color)!important;background:var(--background-color)!important;border:none!important}.sw-update-popup>button{background:#3eaf7c;border-radius:.25rem;color:#fff;-webkit-tap-highlight-color:rgba(0,0,0,0);border:none}.tag-wrapper[data-v-25a0fadc]{max-width:860px;margin:0 auto;padding:4.6rem 2.5rem 0}@media (max-width:719px){.tag-wrapper[data-v-25a0fadc]{padding:4.6rem 1rem 0}}.tags-wrapper[data-v-615c9794]{max-width:860px;margin:0 auto;padding:4.6rem 2.5rem 0}@media (max-width:719px){.tags-wrapper[data-v-615c9794]{padding:5rem .6rem 0}}.timeline-wrapper[data-v-42b59284]{max-width:860px;margin:0 auto;padding:4.6rem 2.5rem 0}.timeline-wrapper .timeline-content[data-v-42b59284]{box-sizing:border-box;position:relative;list-style:none}.timeline-wrapper .timeline-content[data-v-42b59284]:after{content:" ";position:absolute;top:14px;left:0;z-index:-1;margin-left:-2px;width:4px;height:100%;background:var(--border-color)}.timeline-wrapper .timeline-content .desc[data-v-42b59284],.timeline-wrapper .timeline-content .year[data-v-42b59284]{position:relative;color:var(--text-color);font-size:16px}.timeline-wrapper .timeline-content .desc[data-v-42b59284]:before,.timeline-wrapper .timeline-content .year[data-v-42b59284]:before{content:" ";position:absolute;z-index:2;left:-20px;top:50%;margin-left:-4px;margin-top:-4px;width:8px;height:8px;background:var(--background-color);border:1px solid var(--border-color);border-radius:50%}.timeline-wrapper .timeline-content .year[data-v-42b59284]{margin:80px 0 0;color:var(--text-color);font-weight:700;font-size:26px}.timeline-wrapper .timeline-content .year-wrapper[data-v-42b59284]{padding-left:0!important}.timeline-wrapper .timeline-content .year-wrapper li[data-v-42b59284]{display:flex;padding:30px 0 10px;list-style:none;border-bottom:1px dashed var(--border-color);position:relative}.timeline-wrapper .timeline-content .year-wrapper li:hover .date[data-v-42b59284]{color:#3eaf7c}.timeline-wrapper .timeline-content .year-wrapper li:hover .date[data-v-42b59284]:before{background:#3eaf7c}.timeline-wrapper .timeline-content .year-wrapper li:hover .title[data-v-42b59284]{color:#3eaf7c}.timeline-wrapper .timeline-content .year-wrapper li .date[data-v-42b59284]{width:40px;line-height:30px;color:var(--text-color-sub);font-size:12px}.timeline-wrapper .timeline-content .year-wrapper li .date[data-v-42b59284]:before{content:" ";position:absolute;left:-18px;top:41px;width:6px;height:6px;margin-left:-4px;background:var(--background-color);border-radius:50%;border:1px solid var(--border-color);z-index:2}.timeline-wrapper .timeline-content .year-wrapper li .title[data-v-42b59284]{line-height:30px;color:var(--text-color-sub);font-size:16px;cursor:pointer}@media (max-width:719px){.timeline-wrapper[data-v-42b59284]{margin:0 1.2rem}}
\ No newline at end of file
diff --git a/assets/fonts/iconfont.938fa69e.woff b/assets/fonts/iconfont.938fa69e.woff
new file mode 100644
index 0000000..d2e44dc
Binary files /dev/null and b/assets/fonts/iconfont.938fa69e.woff differ
diff --git a/assets/fonts/iconfont.ecabaf00.ttf b/assets/fonts/iconfont.ecabaf00.ttf
new file mode 100644
index 0000000..eb85b12
Binary files /dev/null and b/assets/fonts/iconfont.ecabaf00.ttf differ
diff --git a/assets/img/bg.2cfdbb33.svg b/assets/img/bg.2cfdbb33.svg
new file mode 100644
index 0000000..f576b34
--- /dev/null
+++ b/assets/img/bg.2cfdbb33.svg
@@ -0,0 +1,39 @@
+
diff --git a/assets/js/1.e2979132.js b/assets/js/1.e2979132.js
new file mode 100644
index 0000000..7cc957e
--- /dev/null
+++ b/assets/js/1.e2979132.js
@@ -0,0 +1,8 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{490:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));n(44),n(45);var o=n(96);function r(){var e=Object(o.d)();if(!e)throw new Error("must be called in setup");return e||{}}},491:function(e,t,n){"use strict";n.d(t,"b",(function(){return g})),n.d(t,"a",(function(){return y}));var o=n(547),r=n.n(o),a=n(25),i=n(26),s=n(168),c=n(167),l=n(108),u=(n(265),n(8),n(162),n(93),n(27),n(63),n(64),n(160),n(548),n(509),n(1)),f=n(7),d=function(e,t,n,o){var r,a=arguments.length,i=a<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,n):o;if("object"===("undefined"==typeof Reflect?"undefined":Object(l.a)(Reflect))&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,o);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(i=(a<3?r(i):a>3?r(t,n,i):r(t,n))||i);return a>3&&i&&Object.defineProperty(t,n,i),i},p=/^(\w+)\-/,h=function(e){Object(s.a)(n,e);var t=Object(c.a)(n);function n(){return Object(a.a)(this,n),t.apply(this,arguments)}return Object(i.a)(n,[{key:"getClass",value:function(e){return p.test(e)?e.replace(p,(function(){return"reco"===(arguments.length<=1?void 0:arguments[1])?"iconfont ".concat(arguments.length<=0?void 0:arguments[0]):"".concat(arguments.length<=1?void 0:arguments[1]," ").concat(arguments.length<=0?void 0:arguments[0])})):e}},{key:"go",value:function(e){""!==e&&window.open(e)}},{key:"render",value:function(){var e=arguments[0];return e("i",r()([{},{class:this.getClass(this.icon),on:{click:this.go.bind(this,this.link)}}]),[this.$slots.default])}}]),n}(u.default.extend({props:{icon:{type:String,default:""},link:{type:String,default:""}}})),g=h=d([f.b],h),v=n(17),m=function(e,t,n,o){var r,a=arguments.length,i=a<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,n):o;if("object"===("undefined"==typeof Reflect?"undefined":Object(l.a)(Reflect))&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,o);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(i=(a<3?r(i):a>3?r(t,n,i):r(t,n))||i);return a>3&&i&&Object.defineProperty(t,n,i),i},b=function(e){Object(s.a)(n,e);var t=Object(c.a)(n);function n(){return Object(a.a)(this,n),t.apply(this,arguments)}return Object(i.a)(n,[{key:"setStyle",value:function(e){e.style.transition="transform ".concat(this.duration,"s ease-in-out ").concat(this.delay,"s, opacity ").concat(this.duration,"s ease-in-out ").concat(this.delay,"s"),e.style.transform=this.transform[0],e.style.opacity=0}},{key:"unsetStyle",value:function(e){e.style.transform=this.transform[1],e.style.opacity=1}},{key:"render",value:function(){var e=arguments[0];return e("transition",{attrs:Object(v.a)({},{name:"module"}),on:Object(v.a)({},{enter:this.setStyle,appear:this.setStyle,"before-leave":this.setStyle,"after-appear":this.unsetStyle,"after-enter":this.unsetStyle})},[this.$slots.default])}}]),n}(u.default.extend({props:{delay:{type:String,default:"0"},duration:{type:String,default:".25"},transform:{type:Array,default:function(){return["translateY(-20px)","translateY(0)"]}}}})),y=b=m([f.b],b)},504:function(e,t,n){"use strict";n(90);t.a={data:function(){return{recoShowModule:!1}},mounted:function(){this.recoShowModule=!0},watch:{$route:function(e,t){var n=this;e.path!==t.path&&(this.recoShowModule=!1,setTimeout((function(){n.recoShowModule=!0}),200))}}}},507:function(e,t,n){"use strict";n(8),n(39),n(49),n(65);var o=n(159),r=(n(264),n(17)),a=(n(512),n(491)),i=n(490),s=Object(o.b)({components:{RecoIcon:a.b},setup:function(e,t){var n=Object(i.a)(),a=Object(o.f)({query:"",focused:!1,focusIndex:0,placeholder:void 0}),s=Object(o.a)((function(){return a.focused&&l.value&&l.value.length})),c=function(e){for(var t in n.$site.locales||{})if("/"!==t&&0===e.path.indexOf(t))return t;return"/"},l=Object(o.a)((function(){var e=a.query.trim().toLowerCase();if(e){for(var t=n.$site.pages,o=n.$site.themeConfig.searchMaxSuggestions,r=n.$localePath,i=function(t){return t&&t.title&&t.title.toLowerCase().indexOf(e)>-1},s=[],l=0;l=o);l++){var u=t[l];if(c(u)===r)if(i(u))s.push(u);else if(u.headers)for(var f=0;f=o);f++){var d=u.headers[f];i(d)&&s.push(Object.assign({},u,{path:u.path+"#"+d.slug,header:d}))}}return s}})),u=Object(o.a)((function(){return(n.$site.themeConfig.nav||[]).length+(n.$site.repo?1:0)<=2}));return Object(r.a)({showSuggestions:s,suggestions:l,alignRight:u,onUp:function(){s.value&&(a.focusIndex>0?a.focusIndex--:a.focusIndex=l.value.length-1)},onDown:function(){s.value&&(a.focusIndex "+e._s(t.header.title))]):e._e()])])})),0):e._e()],1)}),[],!1,null,null,null).exports,u=(n(552),Object(c.a)({},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"sidebar-button",on:{click:function(t){return e.$emit("toggle-sidebar")}}},[n("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[n("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null).exports),f=n(66),d=(n(92),n(27),n(64),n(121),n(160),n(553),n(509),n(123),n(63),n(269),n(270),n(271),n(164),n(272),n(510)),p=n(544),h=Object(o.b)({components:{NavLink:d.a,DropdownTransition:p.a,RecoIcon:a.b},props:{item:{required:!0}},setup:function(e,t){var n=Object(o.g)(!1);return{open:n,toggle:function(){n.value=!n.value}}}}),g=(n(555),Object(c.a)(h,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"dropdown-wrapper",class:{open:e.open}},[n("a",{staticClass:"dropdown-title",on:{click:e.toggle}},[n("span",{staticClass:"title"},[n("reco-icon",{attrs:{icon:""+e.item.icon}}),e._v("\n "+e._s(e.item.text)+"\n ")],1),e._v(" "),n("span",{staticClass:"arrow",class:e.open?"down":"right"})]),e._v(" "),n("DropdownTransition",[n("ul",{directives:[{name:"show",rawName:"v-show",value:e.open,expression:"open"}],staticClass:"nav-dropdown"},e._l(e.item.items,(function(t,o){return n("li",{key:t.link||o,staticClass:"dropdown-item"},["links"===t.type?n("h4",[e._v(e._s(t.text))]):e._e(),e._v(" "),"links"===t.type?n("ul",{staticClass:"dropdown-subitem-wrapper"},e._l(t.items,(function(e){return n("li",{key:e.link,staticClass:"dropdown-subitem"},[n("NavLink",{attrs:{item:e}})],1)})),0):n("NavLink",{attrs:{item:t}})],1)})),0)])],1)}),[],!1,null,null,null).exports),v=n(50),m=Object(o.b)({components:{NavLink:d.a,DropdownLink:g,RecoIcon:a.b},setup:function(e,t){var n=Object(i.a)(),r=Object(o.a)((function(){return n.$themeLocaleConfig.nav||n.$themeConfig.nav||[]})),a=Object(o.a)((function(){var e=n.$site.locales||{};if(e&&Object.keys(e).length>1){var t=n.$page.path,o=n.$router.options.routes,a=n.$themeConfig.locales||{},i={text:n.$themeLocaleConfig.selectText||"Languages",items:Object.keys(e).map((function(r){var i,s=e[r],c=a[r]&&a[r].label||s.lang;return s.lang===n.$lang?i=t:(i=t.replace(n.$localeConfig.path,r),o.some((function(e){return e.path===i}))||(i=r)),{text:c,link:i}}))};return[].concat(Object(f.a)(r.value),[i])}var s=n.$themeConfig.blogConfig||{},c=r.value.some((function(e){return!s.category||e.text===(s.category.text||"分类")})),l=r.value.some((function(e){return!s.tag||e.text===(s.tag.text||"标签")}));if(!c&&Object.hasOwnProperty.call(s,"category")){var u=s.category,d=n.$categories;r.value.splice(parseInt(u.location||2)-1,0,{items:d.list.map((function(e){return e.link=e.path,e.text=e.name,e})),text:u.text||n.$recoLocales.category,type:"links",icon:"reco-category"})}if(!l&&Object.hasOwnProperty.call(s,"tag")){var p=s.tag;r.value.splice(parseInt(p.location||3)-1,0,{link:"/tag/",text:p.text||n.$recoLocales.tag,type:"links",icon:"reco-tag"})}return r.value})),s=Object(o.a)((function(){return(n.nav||[]).map((function(e){return Object.assign(Object(v.j)(e),{items:(e.items||[]).map(v.j)})}))})),c=Object(o.a)((function(){var e=n.$themeConfig.repo;return e?/^https?:/.test(e)?e:"https://github.com/".concat(e):""})),l=Object(o.a)((function(){if(!n.repoLink)return"";if(n.$themeConfig.repoLabel)return n.$themeConfig.repoLabel;for(var e=n.repoLink.match(/^https?:\/\/[^/]+/)[0],t=["GitHub","GitLab","Bitbucket"],o=0;o=18?"dark":"light")}}else w(e)}var C={name:"ModeOptions",data:function(){return{modeOptions:[{mode:"dark",title:"dark"},{mode:"auto",title:"auto"},{mode:"light",title:"light"}],currentMode:"auto"}},mounted:function(){this.currentMode=localStorage.getItem("mode")||this.$themeConfig.mode||"auto";var e=this;window.matchMedia("(prefers-color-scheme: dark)").addListener((function(){"auto"===e.$data.currentMode&&O(e.$data.currentMode)})),window.matchMedia("(prefers-color-scheme: light)").addListener((function(){"auto"===e.$data.currentMode&&O(e.$data.currentMode)})),O(this.currentMode)},methods:{selectMode:function(e){e!==this.currentMode&&(this.currentMode=e,O(e),localStorage.setItem("mode",e))},getClass:function(e){return e!==this.currentMode?e:"".concat(e," active")}}},x=(n(558),Object(c.a)(C,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"mode-options"},[n("h4",{staticClass:"title"},[e._v("Choose mode")]),e._v(" "),n("ul",{staticClass:"color-mode-options"},e._l(e.modeOptions,(function(t,o){return n("li",{key:o,class:e.getClass(t.mode),on:{click:function(n){return e.selectMode(t.mode)}}},[e._v(e._s(t.title))])})),0)])}),[],!1,null,null,null).exports),$={name:"UserSettings",directives:{"click-outside":_.a},components:{ModePicker:x,RecoIcon:a.b,ModuleTransition:a.a},data:function(){return{showMenu:!1}},mounted:function(){var e=this.$themeConfig.mode||"auto";!1===this.$themeConfig.modePicker&&("auto"===e&&(window.matchMedia("(prefers-color-scheme: dark)").addListener((function(){O(e)})),window.matchMedia("(prefers-color-scheme: light)").addListener((function(){O(e)}))),O(e))},methods:{hideMenu:function(){this.showMenu=!1}}},j=(n(559),Object(c.a)($,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return!1!==e.$themeConfig.modePicker?n("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:e.hideMenu,expression:"hideMenu"}],staticClass:"color-picker"},[n("a",{staticClass:"color-button",on:{click:function(t){t.preventDefault(),e.showMenu=!e.showMenu}}},[n("reco-icon",{attrs:{icon:"reco-color"}})],1),e._v(" "),n("ModuleTransition",{attrs:{transform:["translate(-50%, 0)","translate(-50%, -10px)"]}},[n("div",{directives:[{name:"show",rawName:"v-show",value:e.showMenu,expression:"showMenu"}],staticClass:"color-picker-menu"},[n("ModePicker")],1)])],1):e._e()}),[],!1,null,null,null).exports),S=Object(o.b)({components:{SidebarButton:u,NavLinks:b,SearchBox:l,AlgoliaSearchBox:{},Mode:j},setup:function(e,t){var n=Object(i.a)(),r=Object(o.g)(null),a=Object(o.a)((function(){return n.$themeLocaleConfig.algolia||n.$themeConfig.algolia||{}})),s=Object(o.a)((function(){a.value&&a.value.apiKey&&a.value.indexName}));function c(e,t){return e.ownerDocument.defaultView.getComputedStyle(e,null)[t]}return Object(o.d)((function(){var e=parseInt(c(n.$el,"paddingLeft"))+parseInt(c(n.$el,"paddingRight")),t=function(){document.documentElement.clientWidth<719?r.value=null:r.value=n.$el.offsetWidth-e-(n.$refs.siteName&&n.$refs.siteName.offsetWidth||0)};t(),window.addEventListener("resize",t,!1)})),{linksWrapMaxWidth:r,algolia:a,isAlgoliaSearch:s,css:c}}}),L=(n(560),Object(c.a)(S,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("header",{staticClass:"navbar"},[n("SidebarButton",{on:{"toggle-sidebar":function(t){return e.$emit("toggle-sidebar")}}}),e._v(" "),n("router-link",{staticClass:"home-link",attrs:{to:e.$localePath}},[e.$themeConfig.logo?n("img",{staticClass:"logo",attrs:{src:e.$withBase(e.$themeConfig.logo),alt:e.$siteTitle}}):e._e(),e._v(" "),e.$siteTitle?n("span",{ref:"siteName",staticClass:"site-name"},[e._v(e._s(e.$siteTitle))]):e._e()]),e._v(" "),n("div",{staticClass:"links",style:e.linksWrapMaxWidth?{"max-width":e.linksWrapMaxWidth+"px"}:{}},[n("Mode"),e._v(" "),e.isAlgoliaSearch?n("AlgoliaSearchBox",{attrs:{options:e.algolia}}):!1!==e.$themeConfig.search&&!1!==e.$frontmatter.search?n("SearchBox"):e._e(),e._v(" "),n("NavLinks",{staticClass:"can-hide"})],1)],1)}),[],!1,null,null,null).exports),I=n(542),M=Object(o.b)({name:"Sidebar",components:{SidebarLinks:I.default,NavLinks:b},props:["items"]}),T=(n(563),Object(c.a)(M,(function(){var e=this.$createElement,t=this._self._c||e;return t("aside",{staticClass:"sidebar"},[this._t("top"),this._v(" "),t("NavLinks"),this._v(" "),t("SidebarLinks",{attrs:{depth:0,items:this.items}}),this._v(" "),this._t("bottom")],2)}),[],!1,null,null,null).exports),P=n(543),E=(n(90),n(525)),B=n.n(E),N=Object(o.b)({name:"Password",components:{ModuleTransition:a.a,RecoIcon:a.b},props:{isPage:{type:Boolean,default:!1}},setup:function(e,t){var n=Object(i.a)(),r=(new Date).getFullYear(),a=Object(o.g)(""),s=Object(o.g)("Konck! Knock!"),c=Object(o.a)((function(){var e;return null==n||null===(e=n.$parent)||void 0===e?void 0:e.recoShowModule})),l=Object(o.h)(e).isPage;return{warningText:s,year:r,key:a,recoShowModule:c,inter:function(){var e=B()(a.value.trim()),t="pageKey".concat(window.location.pathname),o=l.value?t:"key";if(sessionStorage.setItem(o,e),l.value?function(){var e=n.$frontmatter.keys.map((function(e){return e.toLowerCase()})),t="pageKey".concat(window.location.pathname);return e&&e.indexOf(sessionStorage.getItem(t))>-1}():n.$themeConfig.keyPage.keys.map((function(e){return e.toLowerCase()})).indexOf(sessionStorage.getItem("key"))>-1){s.value="Key Success";var r=document.getElementById("box").style.width;n.$refs.passwordBtn.style.width="".concat(r-2,"px"),n.$refs.passwordBtn.style.opacity=1,setTimeout((function(){window.location.reload()}),800)}else s.value="Key Error"},inputFocus:function(){s.value="Input Your Key"},inputBlur:function(){s.value="Konck! Knock!"}}}}),A=(n(567),Object(c.a)(N,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"password-shadow"},[n("ModuleTransition",[n("h3",{directives:[{name:"show",rawName:"v-show",value:e.recoShowModule,expression:"recoShowModule"}],staticClass:"title"},[e._v(e._s(e.isPage?e.$frontmatter.title:e.$site.title||e.$localeConfig.title))])]),e._v(" "),n("ModuleTransition",{attrs:{delay:"0.08"}},[e.recoShowModule&&!e.isPage?n("p",{staticClass:"description"},[e._v(e._s(e.$site.description||e.$localeConfig.description))]):e._e()]),e._v(" "),n("ModuleTransition",{attrs:{delay:"0.16"}},[n("label",{directives:[{name:"show",rawName:"v-show",value:e.recoShowModule,expression:"recoShowModule"}],staticClass:"inputBox",attrs:{id:"box"}},[n("input",{directives:[{name:"model",rawName:"v-model",value:e.key,expression:"key"}],attrs:{type:"password"},domProps:{value:e.key},on:{keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.inter.apply(null,arguments)},focus:e.inputFocus,blur:e.inputBlur,input:function(t){t.target.composing||(e.key=t.target.value)}}}),e._v(" "),n("span",[e._v(e._s(e.warningText))]),e._v(" "),n("button",{ref:"passwordBtn",on:{click:e.inter}},[e._v("OK")])])]),e._v(" "),n("ModuleTransition",{attrs:{delay:"0.24"}},[n("div",{directives:[{name:"show",rawName:"v-show",value:e.recoShowModule,expression:"recoShowModule"}],staticClass:"footer"},[n("span",[n("reco-icon",{attrs:{icon:"reco-theme"}}),e._v(" "),n("a",{attrs:{target:"blank",href:"https://vuepress-theme-reco.recoluan.com"}},[e._v("vuePress-theme-reco")])],1),e._v(" "),n("span",[n("reco-icon",{attrs:{icon:"reco-copyright"}}),e._v(" "),n("a",[e.$themeConfig.author?n("span",[e._v(e._s(e.$themeConfig.author))]):e._e(),e._v("\n \n "),e.$themeConfig.startYear&&e.$themeConfig.startYear!=e.year?n("span",[e._v(e._s(e.$themeConfig.startYear)+" - ")]):e._e(),e._v("\n "+e._s(e.year)+"\n ")])],1)])])],1)}),[],!1,null,"25ba6db2",null).exports),H=n(568),R=Object(o.b)({components:{Sidebar:T,Navbar:L,Password:A,PersonalInfo:P.a},props:{sidebar:{type:Boolean,default:!0},sidebarItems:{type:Array,default:function(){return[]}},showModule:{type:Boolean,default:!1}},setup:function(e,t){var n=Object(i.a)(),r=Object(o.g)(!1),a=Object(o.g)(!0),s=Object(o.g)(!0),c=Object(o.g)(!0),l=Object(o.a)((function(){return e.sidebarItems.length>0})),u=Object(o.a)((function(){return n.$themeConfig.keyPage&&!0===n.$themeConfig.keyPage.absoluteEncryption})),f=Object(o.a)((function(){var e=n.$site.themeConfig;return!1!==n.$page.frontmatter.navbar&&!1!==e.navbar&&(n.$title||e.logo||e.repo||e.nav||n.$themeLocaleConfig.nav)})),d=Object(o.a)((function(){var e={"no-navbar":!f.value,"sidebar-open":r.value,"no-sidebar":!l.value},t=(n.$frontmatter||{}).pageClass;return t&&(e[t]=!0),e})),p=function(){var e=n.$themeConfig.keyPage;if(e&&e.keys&&0!==e.keys.length){var t=e.keys;t=t.map((function(e){return e.toLowerCase()})),a.value=t&&t.indexOf(sessionStorage.getItem("key"))>-1}else a.value=!0},h=function(){var e=n.$frontmatter.keys;e&&0!==e.length?(e=e.map((function(e){return e.toLowerCase()})),s.value=e.indexOf(sessionStorage.getItem("pageKey".concat(window.location.pathname)))>-1):s.value=!0},g=Object(o.h)(e).showModule,v=Object(o.a)((function(){return!!c.value||g.value}));return Object(o.d)((function(){var e;n.$router.afterEach((function(){r.value=!1})),p(),h(),e=n.$frontmatter.home&&null==sessionStorage.getItem("firstLoad")?1e3:0,Object(H.setTimeout)((function(){c.value=!1,null==sessionStorage.getItem("firstLoad")&&sessionStorage.setItem("firstLoad",!1)}),e)})),{isSidebarOpen:r,absoluteEncryption:u,shouldShowNavbar:f,shouldShowSidebar:l,pageClasses:d,hasKey:p,hasPageKey:h,isHasKey:a,isHasPageKey:s,toggleSidebar:function(e){r.value="boolean"==typeof e?e:!r.value},firstLoad:c,recoShowModule:v}},watch:{$frontmatter:function(e,t){this.hasKey(),this.hasPageKey()}}}),K=(n(570),Object(c.a)(R,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"theme-container",class:e.pageClasses},[e.absoluteEncryption?n("div",[n("transition",{attrs:{name:"fade"}},[e.firstLoad?n("LoadingPage"):e.isHasKey?n("div",[e.shouldShowNavbar?n("Navbar",{on:{"toggle-sidebar":e.toggleSidebar}}):e._e(),e._v(" "),n("div",{staticClass:"sidebar-mask",on:{click:function(t){return e.toggleSidebar(!1)}}}),e._v(" "),n("Sidebar",{attrs:{items:e.sidebarItems},on:{"toggle-sidebar":e.toggleSidebar}},[n("PersonalInfo",{attrs:{slot:"top"},slot:"top"}),e._v(" "),e._t("sidebar-bottom",null,{slot:"bottom"})],2),e._v(" "),e.isHasPageKey?e._t("default"):n("Password",{attrs:{isPage:!0}})],2):n("Password")],1)],1):n("div",[n("transition",{attrs:{name:"fade"}},[n("LoadingPage",{directives:[{name:"show",rawName:"v-show",value:e.firstLoad,expression:"firstLoad"}],staticClass:"loading-wrapper"})],1),e._v(" "),n("transition",{attrs:{name:"fade"}},[n("Password",{directives:[{name:"show",rawName:"v-show",value:!e.firstLoad&&!e.isHasKey,expression:"!firstLoad && !isHasKey"}],key:"out",staticClass:"password-wrapper-out"})],1),e._v(" "),n("div",{class:{hide:e.firstLoad||!e.isHasKey}},[e.shouldShowNavbar?n("Navbar",{on:{"toggle-sidebar":e.toggleSidebar}}):e._e(),e._v(" "),n("div",{staticClass:"sidebar-mask",on:{click:function(t){return e.toggleSidebar(!1)}}}),e._v(" "),n("Sidebar",{attrs:{items:e.sidebarItems},on:{"toggle-sidebar":e.toggleSidebar}},[n("PersonalInfo",{attrs:{slot:"top"},slot:"top"}),e._v(" "),e._t("sidebar-bottom",null,{slot:"bottom"})],2),e._v(" "),n("Password",{directives:[{name:"show",rawName:"v-show",value:!e.isHasPageKey,expression:"!isHasPageKey"}],key:"in",staticClass:"password-wrapper-in",attrs:{isPage:!0}}),e._v(" "),n("div",{class:{hide:!e.isHasPageKey}},[e._t("default")],2)],1)],1)])}),[],!1,null,"1aefc0b4",null));t.a=K.exports},509:function(e,t,n){"use strict";var o=n(2),r=n(549);o({target:"String",proto:!0,forced:n(550)("link")},{link:function(e){return r(this,"a","href",e)}})},510:function(e,t,n){"use strict";n(509),n(121),n(8),n(92);var o=n(159),r=n(50),a=n(491),i=n(490),s=Object(o.b)({components:{RecoIcon:a.b},props:{item:{required:!0}},setup:function(e,t){var n=Object(i.a)(),a=Object(o.h)(e).item,s=Object(o.a)((function(){return Object(r.d)(a.value.link)})),c=Object(o.a)((function(){return n.$site.locales?Object.keys(n.$site.locales).some((function(e){return e===s.value})):"/"===s.value}));return{link:s,exact:c,isExternal:r.f,isMailto:r.g,isTel:r.h}}}),c=n(15),l=Object(c.a)(s,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.isExternal(e.link)?n("a",{staticClass:"nav-link external",attrs:{href:e.link,target:e.isMailto(e.link)||e.isTel(e.link)?null:"_blank",rel:e.isMailto(e.link)||e.isTel(e.link)?null:"noopener noreferrer"}},[n("reco-icon",{attrs:{icon:""+e.item.icon}}),e._v("\n "+e._s(e.item.text)+"\n "),n("OutboundLink")],1):n("router-link",{staticClass:"nav-link",attrs:{to:e.link,exact:e.exact}},[n("reco-icon",{attrs:{icon:""+e.item.icon}}),e._v("\n "+e._s(e.item.text)+"\n")],1)}),[],!1,null,null,null);t.a=l.exports},512:function(e,t,n){"use strict";var o=n(2),r=n(165).trim;o({target:"String",proto:!0,forced:n(546)("trim")},{trim:function(){return r(this)}})},513:function(e,t,n){},514:function(e,t,n){},515:function(e,t,n){},516:function(e,t,n){},517:function(e,t,n){},518:function(e,t,n){},519:function(e,t,n){},520:function(e,t,n){},521:function(e,t,n){},522:function(e,t,n){},523:function(e,t,n){},524:function(e,t,n){},525:function(e,t,n){var o,r,a,i,s;o=n(565),r=n(526).utf8,a=n(566),i=n(526).bin,(s=function(e,t){e.constructor==String?e=t&&"binary"===t.encoding?i.stringToBytes(e):r.stringToBytes(e):a(e)?e=Array.prototype.slice.call(e,0):Array.isArray(e)||(e=e.toString());for(var n=o.bytesToWords(e),c=8*e.length,l=1732584193,u=-271733879,f=-1732584194,d=271733878,p=0;p>>24)|4278255360&(n[p]<<24|n[p]>>>8);n[c>>>5]|=128<>>9<<4)]=c;var h=s._ff,g=s._gg,v=s._hh,m=s._ii;for(p=0;p>>0,u=u+y>>>0,f=f+_>>>0,d=d+k>>>0}return o.endian([l,u,f,d])})._ff=function(e,t,n,o,r,a,i){var s=e+(t&n|~t&o)+(r>>>0)+i;return(s<>>32-a)+t},s._gg=function(e,t,n,o,r,a,i){var s=e+(t&o|n&~o)+(r>>>0)+i;return(s<>>32-a)+t},s._hh=function(e,t,n,o,r,a,i){var s=e+(t^n^o)+(r>>>0)+i;return(s<>>32-a)+t},s._ii=function(e,t,n,o,r,a,i){var s=e+(n^(t|~o))+(r>>>0)+i;return(s<>>32-a)+t},s._blocksize=16,s._digestsize=16,e.exports=function(e,t){if(null==e)throw new Error("Illegal argument "+e);var n=o.wordsToBytes(s(e,t));return t&&t.asBytes?n:t&&t.asString?i.bytesToString(n):o.bytesToHex(n)}},526:function(e,t){var n={utf8:{stringToBytes:function(e){return n.bin.stringToBytes(unescape(encodeURIComponent(e)))},bytesToString:function(e){return decodeURIComponent(escape(n.bin.bytesToString(e)))}},bin:{stringToBytes:function(e){for(var t=[],n=0;n-1&&(s.value=e)},l=function(){var e=[].slice.call(document.querySelectorAll(".header-anchor")).filter((function(e){return-1!=decodeURIComponent(n.$route.fullPath).indexOf(decodeURIComponent(e.hash))}));null==e||e.length<1||null==e[0].offsetTop||setTimeout((function(){window.scrollTo(0,e[0].offsetTop+160)}),100)},u=function(){var e=document.getElementsByClassName("sidebar")[0],t=document.getElementsByClassName("active sidebar-link")[1];if(null!=t&&null!=t&&null!=t.offsetTop||(t=document.getElementsByClassName("active sidebar-link")[0]),null!=t&&null!=t&&null!=t.offsetTop){var n=e.clientHeight||window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight,o=t.offsetTop,r=t.offsetTop+t.offsetHeight,a=e.scrollTop;r<=n+a||(e.scrollTop=r+5-n),o>=a||(e.scrollTop=o-5)}};return c(),Object(o.d)((function(){!function(){var e=decodeURIComponent(n.$route.fullPath);if(e&&""!=e)for(var t=[].slice.call(document.querySelectorAll(".sidebar-link")),o=0;o"+c+""+t+">"}},550:function(e,t,n){var o=n(4);e.exports=function(e){return o((function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}))}},551:function(e,t,n){"use strict";n(513)},552:function(e,t,n){"use strict";n(514)},553:function(e,t,n){"use strict";var o=n(2),r=n(0),a=n(122),i=n(51),s=n(33),c=n(20),l=n(163),u=n(67),f=n(95)("splice"),d=r.TypeError,p=Math.max,h=Math.min;o({target:"Array",proto:!0,forced:!f},{splice:function(e,t){var n,o,r,f,g,v,m=c(this),b=s(m),y=a(e,b),_=arguments.length;if(0===_?n=o=0:1===_?(n=0,o=b-y):(n=_-2,o=h(p(i(t),0),b-y)),b+n-o>9007199254740991)throw d("Maximum allowed length exceeded");for(r=l(m,o),f=0;fb-o+n;f--)delete m[f-1]}else if(n>o)for(f=b-o;f>y;f--)v=f+n-1,(g=f+o-1)in m?m[v]=m[g]:delete m[v];for(f=0;f0&&n.unshift(t.target),e.contains(t.target)||function(e,t){if(!e||!t)return!1;for(var n=0,o=t.length;n>>32-t},rotr:function(e,t){return e<<32-t|e>>>t},endian:function(e){if(e.constructor==Number)return 16711935&o.rotl(e,8)|4278255360&o.rotl(e,24);for(var t=0;t0;e--)t.push(Math.floor(256*Math.random()));return t},bytesToWords:function(e){for(var t=[],n=0,o=0;n>>5]|=e[n]<<24-o%32;return t},wordsToBytes:function(e){for(var t=[],n=0;n<32*e.length;n+=8)t.push(e[n>>>5]>>>24-n%32&255);return t},bytesToHex:function(e){for(var t=[],n=0;n>>4).toString(16)),t.push((15&e[n]).toString(16));return t.join("")},hexToBytes:function(e){for(var t=[],n=0;n>>6*(3-a)&63)):t.push("=");return t.join("")},base64ToBytes:function(e){e=e.replace(/[^A-Z0-9+\/]/gi,"");for(var t=[],o=0,r=0;o>>6-2*r);return t}},e.exports=o},566:function(e,t){function n(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}
+/*!
+ * Determine if an object is a Buffer
+ *
+ * @author Feross Aboukhadijeh
+ * @license MIT
+ */
+e.exports=function(e){return null!=e&&(n(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&n(e.slice(0,0))}(e)||!!e._isBuffer)}},567:function(e,t,n){"use strict";n(527)},568:function(e,t,n){var o="undefined"!=typeof global&&global||"undefined"!=typeof self&&self||window,r=Function.prototype.apply;function a(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new a(r.call(setTimeout,o,arguments),clearTimeout)},t.setInterval=function(){return new a(r.call(setInterval,o,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},a.prototype.unref=a.prototype.ref=function(){},a.prototype.close=function(){this._clearFn.call(o,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(569),t.setImmediate="undefined"!=typeof self&&self.setImmediate||"undefined"!=typeof global&&global.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||"undefined"!=typeof global&&global.clearImmediate||this&&this.clearImmediate},569:function(e,t){!function(e,t){"use strict";if(!e.setImmediate){var n,o,r,a,i,s=1,c={},l=!1,u=e.document,f=Object.getPrototypeOf&&Object.getPrototypeOf(e);f=f&&f.setTimeout?f:e,"[object process]"==={}.toString.call(e.process)?n=function(e){process.nextTick((function(){p(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((r=new MessageChannel).port1.onmessage=function(e){p(e.data)},n=function(e){r.port2.postMessage(e)}):u&&"onreadystatechange"in u.createElement("script")?(o=u.documentElement,n=function(e){var t=u.createElement("script");t.onreadystatechange=function(){p(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):n=function(e){setTimeout(p,0,e)}:(a="setImmediate$"+Math.random()+"$",i=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(a)&&p(+t.data.slice(a.length))},e.addEventListener?e.addEventListener("message",i,!1):e.attachEvent("onmessage",i),n=function(t){e.postMessage(a+t,"*")}),f.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),o=0;o")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("BUFFER_LENGTH")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1024")])])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("MAX_EPOLL_EVENTS")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1024")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1024")]),s._v(" ")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//connection ")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("MAX_EPOLL_ITEM")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("102400")]),s._v(" ")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//con")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("SERVER_PORT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8888")])])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("LISTEN_PORT_COUNT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")])])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("typedef")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("NCALLBACK")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" status"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("BUFFER_LENGTH"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" length"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("long")]),s._v(" last_active"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 1024 * 1024")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("recv_cb")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("send_cb")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_set")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" NCALLBACK callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("callback "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("arg "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("last_active "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("time")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("epoll_event")]),s._v(" ep_ev "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ep_ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("ptr "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ep_ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" op"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("status "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n op "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" EPOLL_CTL_MOD"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n op "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" EPOLL_CTL_ADD"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("status "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("epoll_ctl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" op"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("ep_ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"event add failed [fd=%d], events[%d]\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_del")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("epoll_event")]),s._v(" ep_ev "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("status "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n ep_ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("ptr "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("status "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("epoll_ctl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" EPOLL_CTL_DEL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("ep_ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("recv_cb")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ev "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" len "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("recv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" BUFFER_LENGTH"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_del")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("len "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n \n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("length "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" len"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("len"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token char"}},[s._v("'\\0'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"C[%d]:%s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_set")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" send_cb"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" EPOLLOUT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("len "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"[fd=%d] pos[%ld], closed\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"recv[fd=%d] error[%d]:%s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strerror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" len"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("send_cb")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ev "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" len "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("send")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("length"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("len "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"send[fd=%d], [%d]%s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" len"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_del")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_set")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" recv_cb"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" EPOLLIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_del")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"send[fd=%d] error %s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strerror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" len"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("accept_cb")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr_in")]),s._v(" client_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("socklen_t")]),s._v(" len "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("client_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("clientfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("accept")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("client_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("len"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" EAGAIN "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" errno "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" EINTR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"accept: %s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strerror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("do")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" MAX_EPOLL_EVENTS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("status "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("break")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" MAX_EPOLL_EVENTS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"%s: max connect limit[%d]\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("__func__")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" MAX_EPOLL_EVENTS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("break")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("endif")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" flag "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("flag "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("fcntl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" F_SETFL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" O_NONBLOCK"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"%s: fcntl nonblocking failed, %d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("__func__")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" MAX_EPOLL_EVENTS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("break")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_set")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" recv_cb"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" EPOLLIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"new connect [%s:%d][time:%ld], pos[%d]\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("inet_ntoa")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("client_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntohs")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("client_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_port"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("last_active"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("init_sock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("short")]),s._v(" port"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("socket")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("AF_INET"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" SOCK_STREAM"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("fcntl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" F_SETFL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" O_NONBLOCK"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr_in")]),s._v(" server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("memset")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_family "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" AF_INET"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("s_addr "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("htonl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("INADDR_ANY"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_port "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("htons")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("port"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("bind")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("listen")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"listen failed : %s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strerror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"listen port : %d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" port"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_init")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("memset")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("epoll_create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"create epfd in %s err %s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("__func__")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strerror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("malloc")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("MAX_EPOLL_EVENTS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"create epfd in %s err %s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("__func__")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strerror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_destory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("free")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_addlistener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" NCALLBACK "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("acceptor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_set")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" acceptor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" EPOLLIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_run")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("epoll_event")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("MAX_EPOLL_ITEM"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" checkpos "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("long")]),s._v(" now "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("time")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" checkpos "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("checkpos "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" MAX_EPOLL_EVENTS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n checkpos "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("checkpos"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("status "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("continue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("long")]),s._v(" duration "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" now "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("checkpos"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("last_active"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("duration "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("60")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("checkpos"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"[fd=%d] timeout\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("checkpos"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_del")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("checkpos"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("endif")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 一次能从就绪队列带出数量 event长度 时间")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" nready "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("epoll_wait")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" MAX_EPOLL_ITEM"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nready "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"epoll_wait error, exit\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("continue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" nready"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ev "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("ptr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" EPOLLIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" EPOLLIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("callback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" EPOLLOUT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" EPOLLOUT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("callback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" argc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("argv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("unsigned")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("short")]),s._v(" port "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" SERVER_PORT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("argc "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n port "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("atoi")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("argv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("malloc")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_init")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" listenfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("LISTEN_PORT_COUNT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" LISTEN_PORT_COUNT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n listenfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("init_sock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("port"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_addlistener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" listenfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" accept_cb"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_run")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_destory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" LISTEN_PORT_COUNT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("listenfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n \n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br"),a("span",{staticClass:"line-number"},[s._v("52")]),a("br"),a("span",{staticClass:"line-number"},[s._v("53")]),a("br"),a("span",{staticClass:"line-number"},[s._v("54")]),a("br"),a("span",{staticClass:"line-number"},[s._v("55")]),a("br"),a("span",{staticClass:"line-number"},[s._v("56")]),a("br"),a("span",{staticClass:"line-number"},[s._v("57")]),a("br"),a("span",{staticClass:"line-number"},[s._v("58")]),a("br"),a("span",{staticClass:"line-number"},[s._v("59")]),a("br"),a("span",{staticClass:"line-number"},[s._v("60")]),a("br"),a("span",{staticClass:"line-number"},[s._v("61")]),a("br"),a("span",{staticClass:"line-number"},[s._v("62")]),a("br"),a("span",{staticClass:"line-number"},[s._v("63")]),a("br"),a("span",{staticClass:"line-number"},[s._v("64")]),a("br"),a("span",{staticClass:"line-number"},[s._v("65")]),a("br"),a("span",{staticClass:"line-number"},[s._v("66")]),a("br"),a("span",{staticClass:"line-number"},[s._v("67")]),a("br"),a("span",{staticClass:"line-number"},[s._v("68")]),a("br"),a("span",{staticClass:"line-number"},[s._v("69")]),a("br"),a("span",{staticClass:"line-number"},[s._v("70")]),a("br"),a("span",{staticClass:"line-number"},[s._v("71")]),a("br"),a("span",{staticClass:"line-number"},[s._v("72")]),a("br"),a("span",{staticClass:"line-number"},[s._v("73")]),a("br"),a("span",{staticClass:"line-number"},[s._v("74")]),a("br"),a("span",{staticClass:"line-number"},[s._v("75")]),a("br"),a("span",{staticClass:"line-number"},[s._v("76")]),a("br"),a("span",{staticClass:"line-number"},[s._v("77")]),a("br"),a("span",{staticClass:"line-number"},[s._v("78")]),a("br"),a("span",{staticClass:"line-number"},[s._v("79")]),a("br"),a("span",{staticClass:"line-number"},[s._v("80")]),a("br"),a("span",{staticClass:"line-number"},[s._v("81")]),a("br"),a("span",{staticClass:"line-number"},[s._v("82")]),a("br"),a("span",{staticClass:"line-number"},[s._v("83")]),a("br"),a("span",{staticClass:"line-number"},[s._v("84")]),a("br"),a("span",{staticClass:"line-number"},[s._v("85")]),a("br"),a("span",{staticClass:"line-number"},[s._v("86")]),a("br"),a("span",{staticClass:"line-number"},[s._v("87")]),a("br"),a("span",{staticClass:"line-number"},[s._v("88")]),a("br"),a("span",{staticClass:"line-number"},[s._v("89")]),a("br"),a("span",{staticClass:"line-number"},[s._v("90")]),a("br"),a("span",{staticClass:"line-number"},[s._v("91")]),a("br"),a("span",{staticClass:"line-number"},[s._v("92")]),a("br"),a("span",{staticClass:"line-number"},[s._v("93")]),a("br"),a("span",{staticClass:"line-number"},[s._v("94")]),a("br"),a("span",{staticClass:"line-number"},[s._v("95")]),a("br"),a("span",{staticClass:"line-number"},[s._v("96")]),a("br"),a("span",{staticClass:"line-number"},[s._v("97")]),a("br"),a("span",{staticClass:"line-number"},[s._v("98")]),a("br"),a("span",{staticClass:"line-number"},[s._v("99")]),a("br"),a("span",{staticClass:"line-number"},[s._v("100")]),a("br"),a("span",{staticClass:"line-number"},[s._v("101")]),a("br"),a("span",{staticClass:"line-number"},[s._v("102")]),a("br"),a("span",{staticClass:"line-number"},[s._v("103")]),a("br"),a("span",{staticClass:"line-number"},[s._v("104")]),a("br"),a("span",{staticClass:"line-number"},[s._v("105")]),a("br"),a("span",{staticClass:"line-number"},[s._v("106")]),a("br"),a("span",{staticClass:"line-number"},[s._v("107")]),a("br"),a("span",{staticClass:"line-number"},[s._v("108")]),a("br"),a("span",{staticClass:"line-number"},[s._v("109")]),a("br"),a("span",{staticClass:"line-number"},[s._v("110")]),a("br"),a("span",{staticClass:"line-number"},[s._v("111")]),a("br"),a("span",{staticClass:"line-number"},[s._v("112")]),a("br"),a("span",{staticClass:"line-number"},[s._v("113")]),a("br"),a("span",{staticClass:"line-number"},[s._v("114")]),a("br"),a("span",{staticClass:"line-number"},[s._v("115")]),a("br"),a("span",{staticClass:"line-number"},[s._v("116")]),a("br"),a("span",{staticClass:"line-number"},[s._v("117")]),a("br"),a("span",{staticClass:"line-number"},[s._v("118")]),a("br"),a("span",{staticClass:"line-number"},[s._v("119")]),a("br"),a("span",{staticClass:"line-number"},[s._v("120")]),a("br"),a("span",{staticClass:"line-number"},[s._v("121")]),a("br"),a("span",{staticClass:"line-number"},[s._v("122")]),a("br"),a("span",{staticClass:"line-number"},[s._v("123")]),a("br"),a("span",{staticClass:"line-number"},[s._v("124")]),a("br"),a("span",{staticClass:"line-number"},[s._v("125")]),a("br"),a("span",{staticClass:"line-number"},[s._v("126")]),a("br"),a("span",{staticClass:"line-number"},[s._v("127")]),a("br"),a("span",{staticClass:"line-number"},[s._v("128")]),a("br"),a("span",{staticClass:"line-number"},[s._v("129")]),a("br"),a("span",{staticClass:"line-number"},[s._v("130")]),a("br"),a("span",{staticClass:"line-number"},[s._v("131")]),a("br"),a("span",{staticClass:"line-number"},[s._v("132")]),a("br"),a("span",{staticClass:"line-number"},[s._v("133")]),a("br"),a("span",{staticClass:"line-number"},[s._v("134")]),a("br"),a("span",{staticClass:"line-number"},[s._v("135")]),a("br"),a("span",{staticClass:"line-number"},[s._v("136")]),a("br"),a("span",{staticClass:"line-number"},[s._v("137")]),a("br"),a("span",{staticClass:"line-number"},[s._v("138")]),a("br"),a("span",{staticClass:"line-number"},[s._v("139")]),a("br"),a("span",{staticClass:"line-number"},[s._v("140")]),a("br"),a("span",{staticClass:"line-number"},[s._v("141")]),a("br"),a("span",{staticClass:"line-number"},[s._v("142")]),a("br"),a("span",{staticClass:"line-number"},[s._v("143")]),a("br"),a("span",{staticClass:"line-number"},[s._v("144")]),a("br"),a("span",{staticClass:"line-number"},[s._v("145")]),a("br"),a("span",{staticClass:"line-number"},[s._v("146")]),a("br"),a("span",{staticClass:"line-number"},[s._v("147")]),a("br"),a("span",{staticClass:"line-number"},[s._v("148")]),a("br"),a("span",{staticClass:"line-number"},[s._v("149")]),a("br"),a("span",{staticClass:"line-number"},[s._v("150")]),a("br"),a("span",{staticClass:"line-number"},[s._v("151")]),a("br"),a("span",{staticClass:"line-number"},[s._v("152")]),a("br"),a("span",{staticClass:"line-number"},[s._v("153")]),a("br"),a("span",{staticClass:"line-number"},[s._v("154")]),a("br"),a("span",{staticClass:"line-number"},[s._v("155")]),a("br"),a("span",{staticClass:"line-number"},[s._v("156")]),a("br"),a("span",{staticClass:"line-number"},[s._v("157")]),a("br"),a("span",{staticClass:"line-number"},[s._v("158")]),a("br"),a("span",{staticClass:"line-number"},[s._v("159")]),a("br"),a("span",{staticClass:"line-number"},[s._v("160")]),a("br"),a("span",{staticClass:"line-number"},[s._v("161")]),a("br"),a("span",{staticClass:"line-number"},[s._v("162")]),a("br"),a("span",{staticClass:"line-number"},[s._v("163")]),a("br"),a("span",{staticClass:"line-number"},[s._v("164")]),a("br"),a("span",{staticClass:"line-number"},[s._v("165")]),a("br"),a("span",{staticClass:"line-number"},[s._v("166")]),a("br"),a("span",{staticClass:"line-number"},[s._v("167")]),a("br"),a("span",{staticClass:"line-number"},[s._v("168")]),a("br"),a("span",{staticClass:"line-number"},[s._v("169")]),a("br"),a("span",{staticClass:"line-number"},[s._v("170")]),a("br"),a("span",{staticClass:"line-number"},[s._v("171")]),a("br"),a("span",{staticClass:"line-number"},[s._v("172")]),a("br"),a("span",{staticClass:"line-number"},[s._v("173")]),a("br"),a("span",{staticClass:"line-number"},[s._v("174")]),a("br"),a("span",{staticClass:"line-number"},[s._v("175")]),a("br"),a("span",{staticClass:"line-number"},[s._v("176")]),a("br"),a("span",{staticClass:"line-number"},[s._v("177")]),a("br"),a("span",{staticClass:"line-number"},[s._v("178")]),a("br"),a("span",{staticClass:"line-number"},[s._v("179")]),a("br"),a("span",{staticClass:"line-number"},[s._v("180")]),a("br"),a("span",{staticClass:"line-number"},[s._v("181")]),a("br"),a("span",{staticClass:"line-number"},[s._v("182")]),a("br"),a("span",{staticClass:"line-number"},[s._v("183")]),a("br"),a("span",{staticClass:"line-number"},[s._v("184")]),a("br"),a("span",{staticClass:"line-number"},[s._v("185")]),a("br"),a("span",{staticClass:"line-number"},[s._v("186")]),a("br"),a("span",{staticClass:"line-number"},[s._v("187")]),a("br"),a("span",{staticClass:"line-number"},[s._v("188")]),a("br"),a("span",{staticClass:"line-number"},[s._v("189")]),a("br"),a("span",{staticClass:"line-number"},[s._v("190")]),a("br"),a("span",{staticClass:"line-number"},[s._v("191")]),a("br"),a("span",{staticClass:"line-number"},[s._v("192")]),a("br"),a("span",{staticClass:"line-number"},[s._v("193")]),a("br"),a("span",{staticClass:"line-number"},[s._v("194")]),a("br"),a("span",{staticClass:"line-number"},[s._v("195")]),a("br"),a("span",{staticClass:"line-number"},[s._v("196")]),a("br"),a("span",{staticClass:"line-number"},[s._v("197")]),a("br"),a("span",{staticClass:"line-number"},[s._v("198")]),a("br"),a("span",{staticClass:"line-number"},[s._v("199")]),a("br"),a("span",{staticClass:"line-number"},[s._v("200")]),a("br"),a("span",{staticClass:"line-number"},[s._v("201")]),a("br"),a("span",{staticClass:"line-number"},[s._v("202")]),a("br"),a("span",{staticClass:"line-number"},[s._v("203")]),a("br"),a("span",{staticClass:"line-number"},[s._v("204")]),a("br"),a("span",{staticClass:"line-number"},[s._v("205")]),a("br"),a("span",{staticClass:"line-number"},[s._v("206")]),a("br"),a("span",{staticClass:"line-number"},[s._v("207")]),a("br"),a("span",{staticClass:"line-number"},[s._v("208")]),a("br"),a("span",{staticClass:"line-number"},[s._v("209")]),a("br"),a("span",{staticClass:"line-number"},[s._v("210")]),a("br"),a("span",{staticClass:"line-number"},[s._v("211")]),a("br"),a("span",{staticClass:"line-number"},[s._v("212")]),a("br"),a("span",{staticClass:"line-number"},[s._v("213")]),a("br"),a("span",{staticClass:"line-number"},[s._v("214")]),a("br"),a("span",{staticClass:"line-number"},[s._v("215")]),a("br"),a("span",{staticClass:"line-number"},[s._v("216")]),a("br"),a("span",{staticClass:"line-number"},[s._v("217")]),a("br"),a("span",{staticClass:"line-number"},[s._v("218")]),a("br"),a("span",{staticClass:"line-number"},[s._v("219")]),a("br"),a("span",{staticClass:"line-number"},[s._v("220")]),a("br"),a("span",{staticClass:"line-number"},[s._v("221")]),a("br"),a("span",{staticClass:"line-number"},[s._v("222")]),a("br"),a("span",{staticClass:"line-number"},[s._v("223")]),a("br"),a("span",{staticClass:"line-number"},[s._v("224")]),a("br"),a("span",{staticClass:"line-number"},[s._v("225")]),a("br"),a("span",{staticClass:"line-number"},[s._v("226")]),a("br"),a("span",{staticClass:"line-number"},[s._v("227")]),a("br"),a("span",{staticClass:"line-number"},[s._v("228")]),a("br"),a("span",{staticClass:"line-number"},[s._v("229")]),a("br"),a("span",{staticClass:"line-number"},[s._v("230")]),a("br"),a("span",{staticClass:"line-number"},[s._v("231")]),a("br"),a("span",{staticClass:"line-number"},[s._v("232")]),a("br"),a("span",{staticClass:"line-number"},[s._v("233")]),a("br"),a("span",{staticClass:"line-number"},[s._v("234")]),a("br"),a("span",{staticClass:"line-number"},[s._v("235")]),a("br"),a("span",{staticClass:"line-number"},[s._v("236")]),a("br"),a("span",{staticClass:"line-number"},[s._v("237")]),a("br"),a("span",{staticClass:"line-number"},[s._v("238")]),a("br"),a("span",{staticClass:"line-number"},[s._v("239")]),a("br"),a("span",{staticClass:"line-number"},[s._v("240")]),a("br"),a("span",{staticClass:"line-number"},[s._v("241")]),a("br"),a("span",{staticClass:"line-number"},[s._v("242")]),a("br"),a("span",{staticClass:"line-number"},[s._v("243")]),a("br"),a("span",{staticClass:"line-number"},[s._v("244")]),a("br"),a("span",{staticClass:"line-number"},[s._v("245")]),a("br"),a("span",{staticClass:"line-number"},[s._v("246")]),a("br"),a("span",{staticClass:"line-number"},[s._v("247")]),a("br"),a("span",{staticClass:"line-number"},[s._v("248")]),a("br"),a("span",{staticClass:"line-number"},[s._v("249")]),a("br"),a("span",{staticClass:"line-number"},[s._v("250")]),a("br"),a("span",{staticClass:"line-number"},[s._v("251")]),a("br"),a("span",{staticClass:"line-number"},[s._v("252")]),a("br"),a("span",{staticClass:"line-number"},[s._v("253")]),a("br"),a("span",{staticClass:"line-number"},[s._v("254")]),a("br"),a("span",{staticClass:"line-number"},[s._v("255")]),a("br"),a("span",{staticClass:"line-number"},[s._v("256")]),a("br"),a("span",{staticClass:"line-number"},[s._v("257")]),a("br"),a("span",{staticClass:"line-number"},[s._v("258")]),a("br"),a("span",{staticClass:"line-number"},[s._v("259")]),a("br"),a("span",{staticClass:"line-number"},[s._v("260")]),a("br"),a("span",{staticClass:"line-number"},[s._v("261")]),a("br"),a("span",{staticClass:"line-number"},[s._v("262")]),a("br"),a("span",{staticClass:"line-number"},[s._v("263")]),a("br"),a("span",{staticClass:"line-number"},[s._v("264")]),a("br"),a("span",{staticClass:"line-number"},[s._v("265")]),a("br"),a("span",{staticClass:"line-number"},[s._v("266")]),a("br"),a("span",{staticClass:"line-number"},[s._v("267")]),a("br"),a("span",{staticClass:"line-number"},[s._v("268")]),a("br"),a("span",{staticClass:"line-number"},[s._v("269")]),a("br"),a("span",{staticClass:"line-number"},[s._v("270")]),a("br"),a("span",{staticClass:"line-number"},[s._v("271")]),a("br"),a("span",{staticClass:"line-number"},[s._v("272")]),a("br"),a("span",{staticClass:"line-number"},[s._v("273")]),a("br"),a("span",{staticClass:"line-number"},[s._v("274")]),a("br"),a("span",{staticClass:"line-number"},[s._v("275")]),a("br"),a("span",{staticClass:"line-number"},[s._v("276")]),a("br"),a("span",{staticClass:"line-number"},[s._v("277")]),a("br"),a("span",{staticClass:"line-number"},[s._v("278")]),a("br"),a("span",{staticClass:"line-number"},[s._v("279")]),a("br"),a("span",{staticClass:"line-number"},[s._v("280")]),a("br"),a("span",{staticClass:"line-number"},[s._v("281")]),a("br"),a("span",{staticClass:"line-number"},[s._v("282")]),a("br"),a("span",{staticClass:"line-number"},[s._v("283")]),a("br"),a("span",{staticClass:"line-number"},[s._v("284")]),a("br"),a("span",{staticClass:"line-number"},[s._v("285")]),a("br"),a("span",{staticClass:"line-number"},[s._v("286")]),a("br"),a("span",{staticClass:"line-number"},[s._v("287")]),a("br"),a("span",{staticClass:"line-number"},[s._v("288")]),a("br"),a("span",{staticClass:"line-number"},[s._v("289")]),a("br"),a("span",{staticClass:"line-number"},[s._v("290")]),a("br"),a("span",{staticClass:"line-number"},[s._v("291")]),a("br"),a("span",{staticClass:"line-number"},[s._v("292")]),a("br"),a("span",{staticClass:"line-number"},[s._v("293")]),a("br"),a("span",{staticClass:"line-number"},[s._v("294")]),a("br"),a("span",{staticClass:"line-number"},[s._v("295")]),a("br"),a("span",{staticClass:"line-number"},[s._v("296")]),a("br"),a("span",{staticClass:"line-number"},[s._v("297")]),a("br"),a("span",{staticClass:"line-number"},[s._v("298")]),a("br"),a("span",{staticClass:"line-number"},[s._v("299")]),a("br"),a("span",{staticClass:"line-number"},[s._v("300")]),a("br"),a("span",{staticClass:"line-number"},[s._v("301")]),a("br"),a("span",{staticClass:"line-number"},[s._v("302")]),a("br"),a("span",{staticClass:"line-number"},[s._v("303")]),a("br"),a("span",{staticClass:"line-number"},[s._v("304")]),a("br"),a("span",{staticClass:"line-number"},[s._v("305")]),a("br"),a("span",{staticClass:"line-number"},[s._v("306")]),a("br"),a("span",{staticClass:"line-number"},[s._v("307")]),a("br"),a("span",{staticClass:"line-number"},[s._v("308")]),a("br"),a("span",{staticClass:"line-number"},[s._v("309")]),a("br"),a("span",{staticClass:"line-number"},[s._v("310")]),a("br"),a("span",{staticClass:"line-number"},[s._v("311")]),a("br"),a("span",{staticClass:"line-number"},[s._v("312")]),a("br"),a("span",{staticClass:"line-number"},[s._v("313")]),a("br"),a("span",{staticClass:"line-number"},[s._v("314")]),a("br"),a("span",{staticClass:"line-number"},[s._v("315")]),a("br"),a("span",{staticClass:"line-number"},[s._v("316")]),a("br"),a("span",{staticClass:"line-number"},[s._v("317")]),a("br"),a("span",{staticClass:"line-number"},[s._v("318")]),a("br"),a("span",{staticClass:"line-number"},[s._v("319")]),a("br"),a("span",{staticClass:"line-number"},[s._v("320")]),a("br"),a("span",{staticClass:"line-number"},[s._v("321")]),a("br"),a("span",{staticClass:"line-number"},[s._v("322")]),a("br"),a("span",{staticClass:"line-number"},[s._v("323")]),a("br"),a("span",{staticClass:"line-number"},[s._v("324")]),a("br"),a("span",{staticClass:"line-number"},[s._v("325")]),a("br"),a("span",{staticClass:"line-number"},[s._v("326")]),a("br"),a("span",{staticClass:"line-number"},[s._v("327")]),a("br"),a("span",{staticClass:"line-number"},[s._v("328")]),a("br"),a("span",{staticClass:"line-number"},[s._v("329")]),a("br"),a("span",{staticClass:"line-number"},[s._v("330")]),a("br"),a("span",{staticClass:"line-number"},[s._v("331")]),a("br"),a("span",{staticClass:"line-number"},[s._v("332")]),a("br"),a("span",{staticClass:"line-number"},[s._v("333")]),a("br"),a("span",{staticClass:"line-number"},[s._v("334")]),a("br"),a("span",{staticClass:"line-number"},[s._v("335")]),a("br"),a("span",{staticClass:"line-number"},[s._v("336")]),a("br"),a("span",{staticClass:"line-number"},[s._v("337")]),a("br"),a("span",{staticClass:"line-number"},[s._v("338")]),a("br"),a("span",{staticClass:"line-number"},[s._v("339")]),a("br"),a("span",{staticClass:"line-number"},[s._v("340")]),a("br"),a("span",{staticClass:"line-number"},[s._v("341")]),a("br"),a("span",{staticClass:"line-number"},[s._v("342")]),a("br"),a("span",{staticClass:"line-number"},[s._v("343")]),a("br"),a("span",{staticClass:"line-number"},[s._v("344")]),a("br"),a("span",{staticClass:"line-number"},[s._v("345")]),a("br"),a("span",{staticClass:"line-number"},[s._v("346")]),a("br"),a("span",{staticClass:"line-number"},[s._v("347")]),a("br"),a("span",{staticClass:"line-number"},[s._v("348")]),a("br"),a("span",{staticClass:"line-number"},[s._v("349")]),a("br"),a("span",{staticClass:"line-number"},[s._v("350")]),a("br"),a("span",{staticClass:"line-number"},[s._v("351")]),a("br"),a("span",{staticClass:"line-number"},[s._v("352")]),a("br")])]),a("p",[s._v("mul_port_client_epoll.c")]),s._v(" "),a("div",{staticClass:"language-c line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-c"}},[a("code",[s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("MAX_BUFFER")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")])])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("MAX_EPOLLSIZE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("384")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1024")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")])])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("MAX_PORT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")])])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name function"}},[s._v("TIME_SUB_MS")]),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("tv1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" tv2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("tv1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tv_sec "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" tv2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tv_sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("tv1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tv_usec "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" tv2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tv_usec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")])])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" isContinue "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntySetNonblock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" flags"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n flags "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("fcntl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" F_GETFL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("flags "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" flags"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n flags "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|=")]),s._v(" O_NONBLOCK"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("fcntl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" F_SETFL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" flags"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntySetReUseAddr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" reuse "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setsockopt")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" SOL_SOCKET"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" SO_REUSEADDR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("reuse"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reuse"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" argc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("argv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("argc "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Usage: %s ip port\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" argv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("exit")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("const")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ip "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" argv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" port "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("atoi")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("argv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" connections "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" index "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("epoll_event")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("MAX_EPOLLSIZE"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" epoll_fd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("epoll_create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("MAX_EPOLLSIZE"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strcpy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('" Data From MulClient\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr_in")]),s._v(" addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("memset")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr_in")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_family "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" AF_INET"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("s_addr "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("inet_addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ip"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("timeval")]),s._v(" tv_begin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("gettimeofday")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("tv_begin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("index "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" MAX_PORT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" index "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("epoll_event")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" sockfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("connections "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("500000")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v("isContinue"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n sockfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("socket")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("AF_INET"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" SOCK_STREAM"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sockfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("perror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"socket"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("goto")]),s._v(" err"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//ntySetReUseAddr(sockfd);")]),s._v("\n addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_port "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("htons")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("port"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("index"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("connect")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr_in")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("perror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"connect"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("goto")]),s._v(" err"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntySetNonblock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntySetReUseAddr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sprintf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Hello Server: client --\x3e %d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" connections"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("send")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strlen")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("fd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" EPOLLIN "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" EPOLLOUT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("epoll_ctl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("epoll_fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" EPOLL_CTL_ADD"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n connections "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//connections ++;")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("connections "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("%")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("999")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" connections "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("340000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("timeval")]),s._v(" tv_cur"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("memcpy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("tv_cur"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("tv_begin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("timeval")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("gettimeofday")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("tv_begin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" time_used "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("TIME_SUB_MS")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("tv_begin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" tv_cur"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"connections: %d, sockfd:%d, time_used:%d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" connections"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" time_used"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" nfds "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("epoll_wait")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("epoll_fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" connections"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" nfds"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" clientfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" EPOLLOUT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sprintf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"data from %d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("send")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strlen")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" EPOLLIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" rBuffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("MAX_BUFFER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ssize_t")]),s._v(" length "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("recv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" rBuffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" MAX_BUFFER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("length "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('" RecvBuffer:%s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" rBuffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strcmp")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("rBuffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"quit"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n isContinue "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("length "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('" Disconnect clientfd:%d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n connections "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" EINTR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("continue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('" Error clientfd:%d, errno:%d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('" clientfd:%d, errno:%d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("usleep")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\nerr"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"error : %s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strerror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br"),a("span",{staticClass:"line-number"},[s._v("52")]),a("br"),a("span",{staticClass:"line-number"},[s._v("53")]),a("br"),a("span",{staticClass:"line-number"},[s._v("54")]),a("br"),a("span",{staticClass:"line-number"},[s._v("55")]),a("br"),a("span",{staticClass:"line-number"},[s._v("56")]),a("br"),a("span",{staticClass:"line-number"},[s._v("57")]),a("br"),a("span",{staticClass:"line-number"},[s._v("58")]),a("br"),a("span",{staticClass:"line-number"},[s._v("59")]),a("br"),a("span",{staticClass:"line-number"},[s._v("60")]),a("br"),a("span",{staticClass:"line-number"},[s._v("61")]),a("br"),a("span",{staticClass:"line-number"},[s._v("62")]),a("br"),a("span",{staticClass:"line-number"},[s._v("63")]),a("br"),a("span",{staticClass:"line-number"},[s._v("64")]),a("br"),a("span",{staticClass:"line-number"},[s._v("65")]),a("br"),a("span",{staticClass:"line-number"},[s._v("66")]),a("br"),a("span",{staticClass:"line-number"},[s._v("67")]),a("br"),a("span",{staticClass:"line-number"},[s._v("68")]),a("br"),a("span",{staticClass:"line-number"},[s._v("69")]),a("br"),a("span",{staticClass:"line-number"},[s._v("70")]),a("br"),a("span",{staticClass:"line-number"},[s._v("71")]),a("br"),a("span",{staticClass:"line-number"},[s._v("72")]),a("br"),a("span",{staticClass:"line-number"},[s._v("73")]),a("br"),a("span",{staticClass:"line-number"},[s._v("74")]),a("br"),a("span",{staticClass:"line-number"},[s._v("75")]),a("br"),a("span",{staticClass:"line-number"},[s._v("76")]),a("br"),a("span",{staticClass:"line-number"},[s._v("77")]),a("br"),a("span",{staticClass:"line-number"},[s._v("78")]),a("br"),a("span",{staticClass:"line-number"},[s._v("79")]),a("br"),a("span",{staticClass:"line-number"},[s._v("80")]),a("br"),a("span",{staticClass:"line-number"},[s._v("81")]),a("br"),a("span",{staticClass:"line-number"},[s._v("82")]),a("br"),a("span",{staticClass:"line-number"},[s._v("83")]),a("br"),a("span",{staticClass:"line-number"},[s._v("84")]),a("br"),a("span",{staticClass:"line-number"},[s._v("85")]),a("br"),a("span",{staticClass:"line-number"},[s._v("86")]),a("br"),a("span",{staticClass:"line-number"},[s._v("87")]),a("br"),a("span",{staticClass:"line-number"},[s._v("88")]),a("br"),a("span",{staticClass:"line-number"},[s._v("89")]),a("br"),a("span",{staticClass:"line-number"},[s._v("90")]),a("br"),a("span",{staticClass:"line-number"},[s._v("91")]),a("br"),a("span",{staticClass:"line-number"},[s._v("92")]),a("br"),a("span",{staticClass:"line-number"},[s._v("93")]),a("br"),a("span",{staticClass:"line-number"},[s._v("94")]),a("br"),a("span",{staticClass:"line-number"},[s._v("95")]),a("br"),a("span",{staticClass:"line-number"},[s._v("96")]),a("br"),a("span",{staticClass:"line-number"},[s._v("97")]),a("br"),a("span",{staticClass:"line-number"},[s._v("98")]),a("br"),a("span",{staticClass:"line-number"},[s._v("99")]),a("br"),a("span",{staticClass:"line-number"},[s._v("100")]),a("br"),a("span",{staticClass:"line-number"},[s._v("101")]),a("br"),a("span",{staticClass:"line-number"},[s._v("102")]),a("br"),a("span",{staticClass:"line-number"},[s._v("103")]),a("br"),a("span",{staticClass:"line-number"},[s._v("104")]),a("br"),a("span",{staticClass:"line-number"},[s._v("105")]),a("br"),a("span",{staticClass:"line-number"},[s._v("106")]),a("br"),a("span",{staticClass:"line-number"},[s._v("107")]),a("br"),a("span",{staticClass:"line-number"},[s._v("108")]),a("br"),a("span",{staticClass:"line-number"},[s._v("109")]),a("br"),a("span",{staticClass:"line-number"},[s._v("110")]),a("br"),a("span",{staticClass:"line-number"},[s._v("111")]),a("br"),a("span",{staticClass:"line-number"},[s._v("112")]),a("br"),a("span",{staticClass:"line-number"},[s._v("113")]),a("br"),a("span",{staticClass:"line-number"},[s._v("114")]),a("br"),a("span",{staticClass:"line-number"},[s._v("115")]),a("br"),a("span",{staticClass:"line-number"},[s._v("116")]),a("br"),a("span",{staticClass:"line-number"},[s._v("117")]),a("br"),a("span",{staticClass:"line-number"},[s._v("118")]),a("br"),a("span",{staticClass:"line-number"},[s._v("119")]),a("br"),a("span",{staticClass:"line-number"},[s._v("120")]),a("br"),a("span",{staticClass:"line-number"},[s._v("121")]),a("br"),a("span",{staticClass:"line-number"},[s._v("122")]),a("br"),a("span",{staticClass:"line-number"},[s._v("123")]),a("br"),a("span",{staticClass:"line-number"},[s._v("124")]),a("br"),a("span",{staticClass:"line-number"},[s._v("125")]),a("br"),a("span",{staticClass:"line-number"},[s._v("126")]),a("br"),a("span",{staticClass:"line-number"},[s._v("127")]),a("br"),a("span",{staticClass:"line-number"},[s._v("128")]),a("br"),a("span",{staticClass:"line-number"},[s._v("129")]),a("br"),a("span",{staticClass:"line-number"},[s._v("130")]),a("br"),a("span",{staticClass:"line-number"},[s._v("131")]),a("br"),a("span",{staticClass:"line-number"},[s._v("132")]),a("br"),a("span",{staticClass:"line-number"},[s._v("133")]),a("br"),a("span",{staticClass:"line-number"},[s._v("134")]),a("br"),a("span",{staticClass:"line-number"},[s._v("135")]),a("br"),a("span",{staticClass:"line-number"},[s._v("136")]),a("br"),a("span",{staticClass:"line-number"},[s._v("137")]),a("br"),a("span",{staticClass:"line-number"},[s._v("138")]),a("br"),a("span",{staticClass:"line-number"},[s._v("139")]),a("br"),a("span",{staticClass:"line-number"},[s._v("140")]),a("br"),a("span",{staticClass:"line-number"},[s._v("141")]),a("br"),a("span",{staticClass:"line-number"},[s._v("142")]),a("br"),a("span",{staticClass:"line-number"},[s._v("143")]),a("br"),a("span",{staticClass:"line-number"},[s._v("144")]),a("br"),a("span",{staticClass:"line-number"},[s._v("145")]),a("br"),a("span",{staticClass:"line-number"},[s._v("146")]),a("br"),a("span",{staticClass:"line-number"},[s._v("147")]),a("br"),a("span",{staticClass:"line-number"},[s._v("148")]),a("br"),a("span",{staticClass:"line-number"},[s._v("149")]),a("br"),a("span",{staticClass:"line-number"},[s._v("150")]),a("br"),a("span",{staticClass:"line-number"},[s._v("151")]),a("br"),a("span",{staticClass:"line-number"},[s._v("152")]),a("br"),a("span",{staticClass:"line-number"},[s._v("153")]),a("br"),a("span",{staticClass:"line-number"},[s._v("154")]),a("br")])])])}),[],!1,null,null,null);t.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/13.d8a01b18.js b/assets/js/13.d8a01b18.js
new file mode 100644
index 0000000..c752770
--- /dev/null
+++ b/assets/js/13.d8a01b18.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{595:function(t,s,n){"use strict";n.r(s);var a=n(15),e=Object(a.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[n("strong",[t._v("GDB调试手册")])]),t._v(" "),n("p",[n("strong",[t._v("目录")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#0-%E7%94%A8gdb%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F"}},[t._v("0 用GDB调试程序")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#01gdb%E6%A6%82%E8%BF%B0"}},[t._v("0.1 GDB概述")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#02-%E8%B0%83%E8%AF%95%E7%A4%BA%E4%BE%8B"}},[t._v("0.2 调试示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#021-%E6%BA%90%E4%BB%A3%E7%A0%81test1c"}},[t._v("0.2.1 源代码test1.c")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#022-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("0.2.2 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#03-%E4%BD%BF%E7%94%A8gdb"}},[t._v("0.3 使用GDB")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#031-%E5%90%AF%E5%8A%A8gdb"}},[t._v("0.3.1 启动GDB")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#032gdb%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8shell%E5%91%BD%E4%BB%A4"}},[t._v("0.3.2 GDB环境中使用shell命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#033-%E5%9C%A8gdb%E4%B8%AD%E8%BF%90%E8%A1%8C%E7%A8%8B%E5%BA%8F"}},[t._v("0.3.3 在GDB中运行程序")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#1-%E8%AE%BE%E7%BD%AE%E6%96%AD%E7%82%B9"}},[t._v("1 设置断点")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#11-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("1.1 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#12-%E7%A4%BA%E4%BE%8B"}},[t._v("1.2 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#121-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("1.2.1 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#2-%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%8D%95%E6%AD%A5%E6%89%A7%E8%A1%8C"}},[t._v("2 程序的单步执行")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#21-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("2.1 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#22-%E7%A4%BA%E4%BE%8B"}},[t._v("2.2 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#221-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("2.2.1 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#3-%E6%98%BE%E7%A4%BA%E4%BF%AE%E6%94%B9%E5%8F%98%E9%87%8F%E7%9A%84%E5%80%BC"}},[t._v("3 显示/修改变量的值")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#31%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("3.1使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#32%E7%A4%BA%E4%BE%8B"}},[t._v("3.2示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#321-%E6%BA%90%E4%BB%A3%E7%A0%81test2c"}},[t._v("3.2.1 源代码test2.c")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#322-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("3.2.2 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#4-%E7%9B%91%E8%A7%86%E7%A8%8B%E5%BA%8F%E5%8F%98%E9%87%8F%E5%80%BC"}},[t._v("4 监视程序变量值")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#41-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("4.1 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#42-%E7%A4%BA%E4%BE%8B"}},[t._v("4.2 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#421-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("4.2.1 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#5-%E6%98%BE%E7%A4%BA%E4%BF%AE%E6%94%B9%E5%AF%84%E5%AD%98%E5%99%A8"}},[t._v("5 显示/修改寄存器")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#51-%E8%83%8C%E6%99%AF%E7%9F%A5%E8%AF%86"}},[t._v("5.1 背景知识")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#52-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("5.2 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#53-%E7%A4%BA%E4%BE%8B"}},[t._v("5.3 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#521-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("5.2.1 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#6-%E6%9F%A5%E7%9C%8B%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%A0%86%E6%A0%88"}},[t._v("6 查看程序的堆栈")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#61-%E8%83%8C%E6%99%AF%E7%9F%A5%E8%AF%86"}},[t._v("6.1 背景知识")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#62-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("6.2 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#63-%E7%A4%BA%E4%BE%8B"}},[t._v("6.3 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#631-%E6%BA%90%E4%BB%A3%E7%A0%81test3c"}},[t._v("6.3.1 源代码test3.c")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#632-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("6.3.2 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#7-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%B0%83%E8%AF%95"}},[t._v("7 多线程调试")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#71-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("7.1 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#72-%E7%A4%BA%E4%BE%8B"}},[t._v("7.2 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#721-%E6%BA%90%E4%BB%A3%E7%A0%81test4c"}},[t._v("7.2.1 源代码test4.c")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#722-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("7.2.2 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#8-%E6%AD%BB%E9%94%81%E8%B0%83%E8%AF%95"}},[t._v("8 死锁调试")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#81-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("8.1 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#82-%E7%A4%BA%E4%BE%8B"}},[t._v("8.2 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#821-%E6%BA%90%E6%96%87%E4%BB%B6test5c"}},[t._v("8.2.1 源文件test5.c")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#822-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("8.2.2 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#9-core%E6%96%87%E4%BB%B6%E8%B0%83%E8%AF%95"}},[t._v("9 core文件调试")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#91-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("9.1 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#92-%E7%A4%BA%E4%BE%8B"}},[t._v("9.2 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#921-%E6%BA%90%E4%BB%A3%E7%A0%81test6c"}},[t._v("9.2.1 源代码test6.c")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#922-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("9.2.2 调试过程")])]),t._v(" "),n("h1",{attrs:{id:"_0-用gdb调试程序"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-用gdb调试程序"}},[t._v("#")]),t._v(" 0 用GDB调试程序")]),t._v(" "),n("h2",{attrs:{id:"_0-1-gdb概述"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-1-gdb概述"}},[t._v("#")]),t._v(" 0.1 GDB概述")]),t._v(" "),n("p",[t._v("GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。")]),t._v(" "),n("p",[t._v("一般来说,GDB主要帮忙你完成下面四个方面的功能:")]),t._v(" "),n("p",[t._v("1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。")]),t._v(" "),n("p",[t._v("2、调试的程序在你所指定的断点处停住。(断点可以是条件表达式)")]),t._v(" "),n("p",[t._v("3、程序被停住时,可以检查此时你的程序中所发生的事。")]),t._v(" "),n("p",[t._v("4、动态的改变你程序的执行环境。")]),t._v(" "),n("p",[t._v("从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。")]),t._v(" "),n("h2",{attrs:{id:"_0-2-调试示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-2-调试示例"}},[t._v("#")]),t._v(" 0.2 调试示例")]),t._v(" "),n("h3",{attrs:{id:"_0-2-1-源代码test1-c"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-2-1-源代码test1-c"}},[t._v("#")]),t._v(" 0.2.1 源代码test1.c")]),t._v(" "),n("div",{staticClass:"language-c line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-c"}},[n("code",[n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.")]),t._v("#include "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("stdio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("h"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("func")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" sum"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8.")]),t._v(" sum"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" sum"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("11.")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("13.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("14.")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("15.")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("19.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("p "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("23.")]),t._v(" result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("25.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("26.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("27.")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("28.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("29.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("30.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("printf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-100] = %d \\n"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" result "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("32.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("printf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-250] = %d \\n"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("func")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("33.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("34.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("35.")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br")])]),n("h3",{attrs:{id:"_0-2-2-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-2-2-调试过程"}},[t._v("#")]),t._v(" 0.2.2 调试过程")]),t._v(" "),n("p",[t._v("编译生成执行文件:")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[t._v("root@luo:~/workspace/test/ exec"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("gcc -g test1.c -o test1\n使用GDB调试:\nroot@luo:~/workspace/test/exec"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("gdb test1-------------- 启动GDB\nGNU gdb "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Wind River Linux Sourcery CodeBench "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.8")]),t._v("-45"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.6")]),t._v("\nCopyright "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("C"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2013")]),t._v(" Free Software Foundation, Inc.\nLicense GPLv3+: GNU GPL version "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" or later "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("http://gnu.org/licenses/gpl.html"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\nThis is "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("free")]),t._v(" software: you are "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("free")]),t._v(" to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law. Type "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"show copying"')]),t._v("\nand "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"show warranty"')]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" details.\nThis GDB was configured as "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x86_64-wrs-linux-gnu"')]),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\nFor bug reporting instructions, please see:\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("support@windriver.com"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nReading symbols from /home/luo/workspace/test/exec/test1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".done.\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" l "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-------------- 从第一行开始列出源码,l为list缩写\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#include ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\tint func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("int n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\t\tint "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" -------------- 直接回车表示重复上一次命令\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("13")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v("\tint main"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v("\t\tint i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v("\t\tint j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v("\t\tint result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v("\t\tint m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v("\t\tint *p "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v(" -------------- 设置断点,在源程序第16行\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" at 0x400566: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test1.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" func -------------- 设置断点,在func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("函数入口处\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" at 0x400537: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test1.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" info "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" -------------- 显示断点信息\nNum Type Disp Enb Address What\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" breakpoint keep y 0x0000000000400566 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main at test1.c:16\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" breakpoint keep y 0x0000000000400537 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" func at test1.c:5\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" r -------------- 运行程序,r为run简写\nStarting program: /home/luo/workspace/test/exec/test1 \nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test1.c:16\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v("\t\tint i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n -------------- 单条语句执行,next命令简写\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v("\t\tint j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v("\t\tint result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v("\t\tint m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v("\t\tint *p "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序,continue命令简写\nContinuing.\nresult"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-100"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(" -------------- 程序输出\n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(", func "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test1.c:5\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\t\tint "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p i -------------- 打印变量i的值,p为print命令简写\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sum")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p i\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$3")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sum")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$4")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" bt -------------- 查看函数堆栈\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#0 func (n=250) at test1.c:6")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#1 0x00000000004005dd in main () at test1.c:32")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" finish -------------- 退出函数\nRun till "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exit")]),t._v(" from "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#0 func (n=250) at test1.c:6")]),t._v("\n0x00000000004005dd "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test1.c:32\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-250] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nValue returned is "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$5")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31125")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行\nContinuing.\nresult"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-250"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31125")]),t._v(" -------------- 程序输出\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("Inferior "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("46602")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" exited normally"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" ------------ 程序退出,调试结束\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" q -------------- 退出GDB\nroot@luo:~/workspace/test/exec"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br"),n("span",{staticClass:"line-number"},[t._v("53")]),n("br"),n("span",{staticClass:"line-number"},[t._v("54")]),n("br"),n("span",{staticClass:"line-number"},[t._v("55")]),n("br"),n("span",{staticClass:"line-number"},[t._v("56")]),n("br"),n("span",{staticClass:"line-number"},[t._v("57")]),n("br"),n("span",{staticClass:"line-number"},[t._v("58")]),n("br"),n("span",{staticClass:"line-number"},[t._v("59")]),n("br"),n("span",{staticClass:"line-number"},[t._v("60")]),n("br"),n("span",{staticClass:"line-number"},[t._v("61")]),n("br"),n("span",{staticClass:"line-number"},[t._v("62")]),n("br"),n("span",{staticClass:"line-number"},[t._v("63")]),n("br"),n("span",{staticClass:"line-number"},[t._v("64")]),n("br"),n("span",{staticClass:"line-number"},[t._v("65")]),n("br"),n("span",{staticClass:"line-number"},[t._v("66")]),n("br"),n("span",{staticClass:"line-number"},[t._v("67")]),n("br"),n("span",{staticClass:"line-number"},[t._v("68")]),n("br"),n("span",{staticClass:"line-number"},[t._v("69")]),n("br"),n("span",{staticClass:"line-number"},[t._v("70")]),n("br"),n("span",{staticClass:"line-number"},[t._v("71")]),n("br"),n("span",{staticClass:"line-number"},[t._v("72")]),n("br"),n("span",{staticClass:"line-number"},[t._v("73")]),n("br"),n("span",{staticClass:"line-number"},[t._v("74")]),n("br"),n("span",{staticClass:"line-number"},[t._v("75")]),n("br"),n("span",{staticClass:"line-number"},[t._v("76")]),n("br"),n("span",{staticClass:"line-number"},[t._v("77")]),n("br"),n("span",{staticClass:"line-number"},[t._v("78")]),n("br"),n("span",{staticClass:"line-number"},[t._v("79")]),n("br"),n("span",{staticClass:"line-number"},[t._v("80")]),n("br"),n("span",{staticClass:"line-number"},[t._v("81")]),n("br"),n("span",{staticClass:"line-number"},[t._v("82")]),n("br"),n("span",{staticClass:"line-number"},[t._v("83")]),n("br"),n("span",{staticClass:"line-number"},[t._v("84")]),n("br"),n("span",{staticClass:"line-number"},[t._v("85")]),n("br"),n("span",{staticClass:"line-number"},[t._v("86")]),n("br"),n("span",{staticClass:"line-number"},[t._v("87")]),n("br"),n("span",{staticClass:"line-number"},[t._v("88")]),n("br"),n("span",{staticClass:"line-number"},[t._v("89")]),n("br"),n("span",{staticClass:"line-number"},[t._v("90")]),n("br"),n("span",{staticClass:"line-number"},[t._v("91")]),n("br"),n("span",{staticClass:"line-number"},[t._v("92")]),n("br"),n("span",{staticClass:"line-number"},[t._v("93")]),n("br"),n("span",{staticClass:"line-number"},[t._v("94")]),n("br"),n("span",{staticClass:"line-number"},[t._v("95")]),n("br"),n("span",{staticClass:"line-number"},[t._v("96")]),n("br"),n("span",{staticClass:"line-number"},[t._v("97")]),n("br")])]),n("h2",{attrs:{id:"_0-3-使用gdb"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-3-使用gdb"}},[t._v("#")]),t._v(" 0.3 使用GDB")]),t._v(" "),n("p",[t._v("一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:")]),t._v(" "),n("p",[t._v("> cc -g hello.c -o hello")]),t._v(" "),n("p",[t._v("> g++ -g hello.cpp -o hello")]),t._v(" "),n("p",[t._v("如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。")]),t._v(" "),n("h3",{attrs:{id:"_0-3-1-启动gdb"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-3-1-启动gdb"}},[t._v("#")]),t._v(" 0.3.1 启动GDB")]),t._v(" "),n("p",[t._v("启动GDB的方法有以下几种:")]),t._v(" "),n("p",[t._v("1、gdb ")]),t._v(" "),n("p",[t._v("program也就是你的执行文件,一般在当然目录下。")]),t._v(" "),n("p",[t._v("2、gdb core")]),t._v(" "),n("p",[t._v("用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。")]),t._v(" "),n("p",[t._v("3、gdb ")]),t._v(" "),n("p",[t._v("如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。")]),t._v(" "),n("p",[t._v("GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。下面只例举一些比较常用的参数:")]),t._v(" "),n("p",[t._v("-symbols ")]),t._v(" "),n("p",[t._v("-s ")]),t._v(" "),n("p",[t._v("从指定文件中读取符号表。")]),t._v(" "),n("p",[t._v("-se file")]),t._v(" "),n("p",[t._v("指定文件中读取符号表信息,并把他用在可执行文件中。")]),t._v(" "),n("p",[t._v("-core ")]),t._v(" "),n("p",[t._v("-c ")]),t._v(" "),n("p",[t._v("调试时core dump的core文件。")]),t._v(" "),n("p",[t._v("-directory ")]),t._v(" "),n("p",[t._v("-d ")]),t._v(" "),n("p",[t._v("加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。")]),t._v(" "),n("h3",{attrs:{id:"_0-3-2-gdb环境中使用shell命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-3-2-gdb环境中使用shell命令"}},[t._v("#")]),t._v(" 0.3.2 GDB环境中使用shell命令")]),t._v(" "),n("p",[t._v("在gdb环境中,你可以执行UNIX的shell的命令,使用gdb的shell命令来完成:")]),t._v(" "),n("p",[n("strong",[t._v("shell ")])]),t._v(" "),n("p",[t._v("调用UNIX的shell来执行,环境变量SHELL中定义的UNIX的shell将会被用来执行,如果SHELL没有定义,那就使用UNIX的标准shell:/bin/sh。(在Windows中使用Command.com或cmd.exe)")]),t._v(" "),n("p",[t._v("还有一个gdb命令是make:")]),t._v(" "),n("p",[n("strong",[t._v("make ")])]),t._v(" "),n("p",[t._v("可以在gdb中执行make命令来重新build自己的程序。这个命令等价于“shell make ”。")]),t._v(" "),n("h3",{attrs:{id:"_0-3-3-在gdb中运行程序"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-3-3-在gdb中运行程序"}},[t._v("#")]),t._v(" 0.3.3 在GDB中运行程序")]),t._v(" "),n("p",[t._v("当以gdb 方式启动gdb后,gdb会在PATH路径和当前目录中搜索的源文件。如要确认gdb是否读到源文件,可使用l或list命令,看看gdb是否能列出源代码。")]),t._v(" "),n("p",[t._v("在gdb中,运行程序使用r或是run命令。程序的运行,你有可能需要设置下面四方面的事。")]),t._v(" "),n("p",[t._v("1、程序运行参数。")]),t._v(" "),n("p",[t._v("set args 可指定运行时参数。(如:set args 10 20 30 40 50)")]),t._v(" "),n("p",[t._v("show args 命令可以查看设置好的运行参数。")]),t._v(" "),n("p",[t._v("2、运行环境。")]),t._v(" "),n("p",[t._v("path 可设定程序的运行路径。")]),t._v(" "),n("p",[t._v("show paths 查看程序的运行路径。")]),t._v(" "),n("p",[t._v("set environment varname [=value] 设置环境变量。如:set env USER=aaa")]),t._v(" "),n("p",[t._v("show environment [varname] 查看环境变量。")]),t._v(" "),n("p",[t._v("3、工作目录。")]),t._v(" "),n("p",[t._v("cd 相当于shell的cd命令。")]),t._v(" "),n("p",[t._v("pwd 显示当前的所在目录。")]),t._v(" "),n("p",[t._v("4、程序的输入输出。")]),t._v(" "),n("p",[t._v("info terminal 显示你程序用到的终端的模式。")]),t._v(" "),n("p",[t._v("使用重定向控制程序输出。如:run > outfile")]),t._v(" "),n("p",[t._v("tty命令可以指写输入输出的终端设备。如:tty /dev/ttyb。")]),t._v(" "),n("h1",{attrs:{id:"_1-设置断点"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-设置断点"}},[t._v("#")]),t._v(" 1 设置断点")]),t._v(" "),n("h2",{attrs:{id:"_1-1-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-1-使用命令"}},[t._v("#")]),t._v(" 1.1 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("break linenum")])]),t._v(" "),n("p",[t._v("在指定行号设置断点。")]),t._v(" "),n("p",[n("strong",[t._v("break function")])]),t._v(" "),n("p",[t._v("在函数function的入口处设置断点。C++中可以使用class::function或function(type,type)格式来指定函数名。")]),t._v(" "),n("p",[n("strong",[t._v("break +offset/-offset")])]),t._v(" "),n("p",[t._v("在当前行前面或后面offset行设置断点,offset为自然数。")]),t._v(" "),n("p",[n("strong",[t._v("break filename:linenum")])]),t._v(" "),n("p",[t._v("在源文件filename的linenum行处设置断点。")]),t._v(" "),n("p",[n("strong",[t._v("break filename:function")])]),t._v(" "),n("p",[t._v("在源文件filename的function函数的入口处设置断点。")]),t._v(" "),n("p",[n("strong",[t._v("break")])]),t._v(" "),n("p",[t._v("break命令没有参数时,表示在下一条指令处设置断点。")]),t._v(" "),n("p",[n("strong",[t._v("break args if cond")])]),t._v(" "),n("p",[t._v("设置一个带有条件cond的断点,只有条件为“真”时才停止。args代表上述参数之一。")]),t._v(" "),n("p",[n("strong",[t._v("delete [breakpoint num]")])]),t._v(" "),n("p",[t._v("删除断点,breakpoint num为断点号。")]),t._v(" "),n("p",[n("strong",[t._v("tbreak args")])]),t._v(" "),n("p",[t._v("设置仅停止一次的断点。args与上面break命令的相同。程序在该断点停止后,该断点便立即被删除。")]),t._v(" "),n("h2",{attrs:{id:"_1-2-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-示例"}},[t._v("#")]),t._v(" 1.2 示例")]),t._v(" "),n("p",[t._v("源代码test1.c 同上")]),t._v(" "),n("h3",{attrs:{id:"_1-2-1-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-1-调试过程"}},[t._v("#")]),t._v(" 1.2.1 调试过程")]),t._v(" "),n("p",[t._v("编译生成可执行文件,注意要带上 "),n("em",[t._v("-g")]),t._v(" :")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/source\\>gcc -g test.c -o ../exec/test")])]),t._v(" "),n("p",[t._v("使用GDB调试:")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[t._v("\nroot@luo:~/workspace/test/source"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("gcc -g test.c -o "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("/exec/test\n使用GDB调试:\nroot@luo:~/workspace/test/exec"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("gdb "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" \nGNU gdb "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Wind River Linux Sourcery CodeBench "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.8")]),t._v("-45"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.6")]),t._v("\nCopyright "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("C"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2013")]),t._v(" Free Software Foundation, Inc.\nLicense GPLv3+: GNU GPL version "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" or later "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("http://gnu.org/licenses/gpl.html"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\nThis is "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("free")]),t._v(" software: you are "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("free")]),t._v(" to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law. Type "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"show copying"')]),t._v("\nand "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"show warranty"')]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" details.\nThis GDB was configured as "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x86_64-wrs-linux-gnu"')]),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\nFor bug reporting instructions, please see:\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("support@windriver.com"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nReading symbols from /home/luo/workspace/test/exec/test"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".done.\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" l "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" -------------- l为list的简写,从第一行开始列出源码\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#include ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\tint func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("int n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\t\tint "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" -------------- 直接回车,表示重复上一次命令\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("13")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v("\tint main"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v("\t\tint i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v("\t\tint j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v("\t\tint result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v("\t\tint m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v("\t\tint *p "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v("\t\t\tresult "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),t._v("\t \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v("\t\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v("\t\t\t\tm++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("28")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("29")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-100] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", result "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-250] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("33")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("34")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("35")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" main -------------- 设置断点,在函数main"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("入口处。\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" at 0x400566: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(" -------------- 设置断点,在源程序第21行\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" at 0x400585: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" test.c:func -------------- 设置断点,在test.c文件的func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("函数入口处\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" at 0x400537: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" r -------------- 运行程序,run命令简写\nStarting program: /home/luo/workspace/test/exec/test \n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:17 ---------- 程序在main"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("入口停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v("\t\tint j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序,continue命令的简写\nContinuing.\n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:22 -------------- 程序在22行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" tbreak "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),t._v(" -------------- 设置临时断点,在26行\nTemporary breakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(" at 0x400594: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" info b -------------- 查看断点信息\nNum Type Disp Enb Address What\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" breakpoint keep y 0x0000000000400566 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main at test.c:17\n\tbreakpoint already hit "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("time")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" breakpoint keep y 0x0000000000400585 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main at test.c:21\n\tbreakpoint already hit "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("time")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" breakpoint keep y 0x0000000000400537 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" func at test.c:5\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(" breakpoint del y 0x0000000000400594 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main at test.c:26\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\n\nTemporary breakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:26 --------------程序在26行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" info b -------------- 再查看断点信息,临时断点已删除\nNum Type Disp Enb Address What\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" breakpoint keep y 0x0000000000400566 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main at test.c:17\n\tbreakpoint already hit "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("time")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" breakpoint keep y 0x0000000000400585 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main at test.c:21\n\tbreakpoint already hit "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("time")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" breakpoint keep y 0x0000000000400537 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" func at test.c:5\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(" ------------ 设置断点,在27行,当m"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v("时生效\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(" at 0x4005b1: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:22 ------------ 程序在22行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:22\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:30 -------------- 程序在30行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" print "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"%d"')]),t._v(", m -------------- 打印m的值\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(" -------------- 此时m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\nresult"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-100"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(" \n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(", func "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:5 ---------- 程序在func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("函数入口处停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\t\tint "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" tbreak +3 -------------- 在当前行+3行处设置临时断点\nTemporary breakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v(" at 0x400547: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\nTemporary breakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v(", func "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:8\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" -------------- 在下一条指令处设置断点\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v(" at 0x400547: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v(", func "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:8 -------------- 在第8行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v(", func "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:8 -------------- 在第8行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("clear")]),t._v(" --------------清楚所有断点\nDeleted breakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\nresult"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-250"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31125")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br"),n("span",{staticClass:"line-number"},[t._v("53")]),n("br"),n("span",{staticClass:"line-number"},[t._v("54")]),n("br"),n("span",{staticClass:"line-number"},[t._v("55")]),n("br"),n("span",{staticClass:"line-number"},[t._v("56")]),n("br"),n("span",{staticClass:"line-number"},[t._v("57")]),n("br"),n("span",{staticClass:"line-number"},[t._v("58")]),n("br"),n("span",{staticClass:"line-number"},[t._v("59")]),n("br"),n("span",{staticClass:"line-number"},[t._v("60")]),n("br"),n("span",{staticClass:"line-number"},[t._v("61")]),n("br"),n("span",{staticClass:"line-number"},[t._v("62")]),n("br"),n("span",{staticClass:"line-number"},[t._v("63")]),n("br"),n("span",{staticClass:"line-number"},[t._v("64")]),n("br"),n("span",{staticClass:"line-number"},[t._v("65")]),n("br"),n("span",{staticClass:"line-number"},[t._v("66")]),n("br"),n("span",{staticClass:"line-number"},[t._v("67")]),n("br"),n("span",{staticClass:"line-number"},[t._v("68")]),n("br"),n("span",{staticClass:"line-number"},[t._v("69")]),n("br"),n("span",{staticClass:"line-number"},[t._v("70")]),n("br"),n("span",{staticClass:"line-number"},[t._v("71")]),n("br"),n("span",{staticClass:"line-number"},[t._v("72")]),n("br"),n("span",{staticClass:"line-number"},[t._v("73")]),n("br"),n("span",{staticClass:"line-number"},[t._v("74")]),n("br"),n("span",{staticClass:"line-number"},[t._v("75")]),n("br"),n("span",{staticClass:"line-number"},[t._v("76")]),n("br"),n("span",{staticClass:"line-number"},[t._v("77")]),n("br"),n("span",{staticClass:"line-number"},[t._v("78")]),n("br"),n("span",{staticClass:"line-number"},[t._v("79")]),n("br"),n("span",{staticClass:"line-number"},[t._v("80")]),n("br"),n("span",{staticClass:"line-number"},[t._v("81")]),n("br"),n("span",{staticClass:"line-number"},[t._v("82")]),n("br"),n("span",{staticClass:"line-number"},[t._v("83")]),n("br"),n("span",{staticClass:"line-number"},[t._v("84")]),n("br"),n("span",{staticClass:"line-number"},[t._v("85")]),n("br"),n("span",{staticClass:"line-number"},[t._v("86")]),n("br"),n("span",{staticClass:"line-number"},[t._v("87")]),n("br"),n("span",{staticClass:"line-number"},[t._v("88")]),n("br"),n("span",{staticClass:"line-number"},[t._v("89")]),n("br"),n("span",{staticClass:"line-number"},[t._v("90")]),n("br"),n("span",{staticClass:"line-number"},[t._v("91")]),n("br"),n("span",{staticClass:"line-number"},[t._v("92")]),n("br"),n("span",{staticClass:"line-number"},[t._v("93")]),n("br"),n("span",{staticClass:"line-number"},[t._v("94")]),n("br"),n("span",{staticClass:"line-number"},[t._v("95")]),n("br"),n("span",{staticClass:"line-number"},[t._v("96")]),n("br"),n("span",{staticClass:"line-number"},[t._v("97")]),n("br"),n("span",{staticClass:"line-number"},[t._v("98")]),n("br"),n("span",{staticClass:"line-number"},[t._v("99")]),n("br"),n("span",{staticClass:"line-number"},[t._v("100")]),n("br"),n("span",{staticClass:"line-number"},[t._v("101")]),n("br"),n("span",{staticClass:"line-number"},[t._v("102")]),n("br"),n("span",{staticClass:"line-number"},[t._v("103")]),n("br"),n("span",{staticClass:"line-number"},[t._v("104")]),n("br"),n("span",{staticClass:"line-number"},[t._v("105")]),n("br"),n("span",{staticClass:"line-number"},[t._v("106")]),n("br"),n("span",{staticClass:"line-number"},[t._v("107")]),n("br"),n("span",{staticClass:"line-number"},[t._v("108")]),n("br"),n("span",{staticClass:"line-number"},[t._v("109")]),n("br"),n("span",{staticClass:"line-number"},[t._v("110")]),n("br"),n("span",{staticClass:"line-number"},[t._v("111")]),n("br"),n("span",{staticClass:"line-number"},[t._v("112")]),n("br"),n("span",{staticClass:"line-number"},[t._v("113")]),n("br"),n("span",{staticClass:"line-number"},[t._v("114")]),n("br"),n("span",{staticClass:"line-number"},[t._v("115")]),n("br"),n("span",{staticClass:"line-number"},[t._v("116")]),n("br"),n("span",{staticClass:"line-number"},[t._v("117")]),n("br"),n("span",{staticClass:"line-number"},[t._v("118")]),n("br"),n("span",{staticClass:"line-number"},[t._v("119")]),n("br"),n("span",{staticClass:"line-number"},[t._v("120")]),n("br"),n("span",{staticClass:"line-number"},[t._v("121")]),n("br"),n("span",{staticClass:"line-number"},[t._v("122")]),n("br"),n("span",{staticClass:"line-number"},[t._v("123")]),n("br"),n("span",{staticClass:"line-number"},[t._v("124")]),n("br"),n("span",{staticClass:"line-number"},[t._v("125")]),n("br"),n("span",{staticClass:"line-number"},[t._v("126")]),n("br"),n("span",{staticClass:"line-number"},[t._v("127")]),n("br"),n("span",{staticClass:"line-number"},[t._v("128")]),n("br"),n("span",{staticClass:"line-number"},[t._v("129")]),n("br"),n("span",{staticClass:"line-number"},[t._v("130")]),n("br"),n("span",{staticClass:"line-number"},[t._v("131")]),n("br"),n("span",{staticClass:"line-number"},[t._v("132")]),n("br"),n("span",{staticClass:"line-number"},[t._v("133")]),n("br"),n("span",{staticClass:"line-number"},[t._v("134")]),n("br"),n("span",{staticClass:"line-number"},[t._v("135")]),n("br"),n("span",{staticClass:"line-number"},[t._v("136")]),n("br"),n("span",{staticClass:"line-number"},[t._v("137")]),n("br"),n("span",{staticClass:"line-number"},[t._v("138")]),n("br")])]),n("h1",{attrs:{id:"_2-程序的单步执行"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-程序的单步执行"}},[t._v("#")]),t._v(" 2 程序的单步执行")]),t._v(" "),n("h2",{attrs:{id:"_2-1-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-1-使用命令"}},[t._v("#")]),t._v(" 2.1 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("step ")])]),t._v(" "),n("p",[t._v("单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。")]),t._v(" "),n("p",[n("strong",[t._v("next ")])]),t._v(" "),n("p",[t._v("同样单步跟踪,如果有函数调用,他不会进入该函数。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。")]),t._v(" "),n("p",[n("strong",[t._v("finish")])]),t._v(" "),n("p",[t._v("运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。")]),t._v(" "),n("p",[n("strong",[t._v("until 或 u")])]),t._v(" "),n("p",[t._v("当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。")]),t._v(" "),n("h2",{attrs:{id:"_2-2-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-2-示例"}},[t._v("#")]),t._v(" 2.2 示例")]),t._v(" "),n("p",[t._v("源代码test1.c 同上")]),t._v(" "),n("h3",{attrs:{id:"_2-2-1-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-2-1-调试过程"}},[t._v("#")]),t._v(" 2.2.1 调试过程")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[t._v("root@luo:~/workspace/test/exec"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("gdb -q "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" \n----- 启动GDB,-q使启动使版本信息不显示\nReading symbols from /home/luo/workspace/test/exec/test"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".done.\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(" -------------- 在第18行设置断点\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" at 0x400574: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" r -------------- 运行程序\nStarting program: /home/luo/workspace/test/exec/test \n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:18 -------------- 在18行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v("\t\tint result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n -------------- 下一条\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v("\t\tint m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n -------------- 下一条\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v("\t\tint *p "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" s -------------- 下一条\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" s -------------- 下一条\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v("\t\t\tresult "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n -------------- 下一条\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v("\t\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n -------------- 下一条 \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v("\t\t\t\tm++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" u -------------- 运行函数到退出当前循环\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v("\t\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" u -------------- 运行程序到退出当前循环\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" u -------------- 运行程序到退出当前循环\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-100] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", result "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" s -------------- 下一条\nresult"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-100"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-250] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" s -------------- step下一条\nfunc "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:5 -------------- 进入函数func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\t\tint "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" finish -------------- 运行程序到函数完成\nRun till "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exit")]),t._v(" from "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#0 func (n=250) at test.c:5")]),t._v("\n0x00000000004005dd "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:32\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-250] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nValue returned is "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31125")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" r -------------- 再次运行程序\nThe program being debugged has been started already.\nStart it from the beginning? "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y or n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" y\nStarting program: /home/luo/workspace/test/exec/test \nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:18 -------------- 程序在18行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v("\t\tint result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" -------------- 设置断点,在30行\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" at 0x4005bf: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:31 -------------- 程序在31行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-100] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", result "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n -------------- next下一条\nresult"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-100"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-250] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n -------------- next下一条\nresult"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-250"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31125")]),t._v(" -------------- 未进入函数func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("34")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br"),n("span",{staticClass:"line-number"},[t._v("53")]),n("br"),n("span",{staticClass:"line-number"},[t._v("54")]),n("br"),n("span",{staticClass:"line-number"},[t._v("55")]),n("br"),n("span",{staticClass:"line-number"},[t._v("56")]),n("br"),n("span",{staticClass:"line-number"},[t._v("57")]),n("br"),n("span",{staticClass:"line-number"},[t._v("58")]),n("br")])]),n("h1",{attrs:{id:"_3-显示-修改变量的值"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-显示-修改变量的值"}},[t._v("#")]),t._v(" 3 显示/修改变量的值")]),t._v(" "),n("h2",{attrs:{id:"_3-1使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-1使用命令"}},[t._v("#")]),t._v(" 3.1使用命令")]),t._v(" "),n("p",[n("strong",[t._v("print ")])]),t._v(" "),n("p",[n("strong",[t._v("print / ")])]),t._v(" "),n("p",[t._v("当程序被停住时,可以使用print命令(简写为p),或同义命令inspect来查看当前程序的运行数据。是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x。")]),t._v(" "),n("p",[n("strong",[t._v("注意")]),t._v(":GDB中,变量分为全局变量、静态全局变量、局部变量三种,当局部变量与全局变量发生重名时,用pirnt显示出的变量的值会是函数中的局部变量的值。此时如果要查看全局变量的值,可以使用“::”操作符:")]),t._v(" "),n("p",[n("strong",[t._v("file::variable")])]),t._v(" "),n("p",[n("strong",[t._v("function::variable")])]),t._v(" "),n("p",[t._v("可以通过这种形式查看某个文件或是某个函数的变量。")]),t._v(" "),n("h2",{attrs:{id:"_3-2示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-2示例"}},[t._v("#")]),t._v(" 3.2示例")]),t._v(" "),n("h3",{attrs:{id:"_3-2-1-源代码test2-c"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-2-1-源代码test2-c"}},[t._v("#")]),t._v(" 3.2.1 源代码test2.c")]),t._v(" "),n("div",{staticClass:"language-c line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-c"}},[n("code",[n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.")]),t._v("#include "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("stdio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("h"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("func")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("11.")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("13.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("14.")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("15.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" sum "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("19.")]),t._v(" sum "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("func")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21.")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("23.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br")])]),n("h3",{attrs:{id:"_3-2-2-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-2-2-调试过程"}},[t._v("#")]),t._v(" 3.2.2 调试过程")]),t._v(" "),n("p",[t._v("编译生成可执行文件:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/source\\>gcc -g test2.c -o ../exec/test2")])]),t._v(" "),n("p",[t._v("启动GDB:")]),t._v(" "),n("div",{staticClass:"language-sh line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-sh"}},[n("code",[t._v("\nroot@luo:~/workspace/test/source"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("gcc -g test2.c -o "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("/exec/test2\n启动GDB:\nroot@luo:~/workspace/test/exec"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("gdb -q test2\nReading symbols from /home/luo/workspace/test/exec/test2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".done.\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" l "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#include ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\tint func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("int m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v("\t\tint n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\t\tint i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),t._v("\t\t\tn "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("return")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("13")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v("\tint "),n("span",{pre:!0,attrs:{class:"token function-name function"}},[t._v("main")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v("\t\tint i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v("\t\tint b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v("\t\tint n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v("\t\tint "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sum")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sum")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v("\t\t\tn++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" func -------------- 设置断点,在func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("函数入口处\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" at 0x4004f7: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test2.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(" -------------- 设置断点,在21行\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" at 0x40055f: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test2.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" r -------------- 运行程序\nStarting program: /home/luo/workspace/test/exec/test2 \n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(", func "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("m"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test2.c:4\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v("\t\tint n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p n -------------- 在func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("函数内,显示变量n的值\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p main::n ------------ 在func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("内,显示main"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("函数中n的值\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test2.c:21\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v("\t\t\tn++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p n -------------- 显示n的值\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$3")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v(" -------------- 修改n的值为50\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$4")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p n -------------- 显示n的值\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$5")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test2.c:21\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v("\t\t\tn++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p n ------------ 显示n的值,可以看到,n在修改基础上加1\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$6")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("51")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p /x n ------------ 用16进制显示n值\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$7")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" 0x33 \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br"),n("span",{staticClass:"line-number"},[t._v("53")]),n("br"),n("span",{staticClass:"line-number"},[t._v("54")]),n("br"),n("span",{staticClass:"line-number"},[t._v("55")]),n("br"),n("span",{staticClass:"line-number"},[t._v("56")]),n("br"),n("span",{staticClass:"line-number"},[t._v("57")]),n("br"),n("span",{staticClass:"line-number"},[t._v("58")]),n("br"),n("span",{staticClass:"line-number"},[t._v("59")]),n("br"),n("span",{staticClass:"line-number"},[t._v("60")]),n("br"),n("span",{staticClass:"line-number"},[t._v("61")]),n("br"),n("span",{staticClass:"line-number"},[t._v("62")]),n("br"),n("span",{staticClass:"line-number"},[t._v("63")]),n("br"),n("span",{staticClass:"line-number"},[t._v("64")]),n("br"),n("span",{staticClass:"line-number"},[t._v("65")]),n("br"),n("span",{staticClass:"line-number"},[t._v("66")]),n("br"),n("span",{staticClass:"line-number"},[t._v("67")]),n("br")])]),n("h1",{attrs:{id:"_4-监视程序变量值"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-监视程序变量值"}},[t._v("#")]),t._v(" 4 监视程序变量值")]),t._v(" "),n("h2",{attrs:{id:"_4-1-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-1-使用命令"}},[t._v("#")]),t._v(" 4.1 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("display ")])]),t._v(" "),n("p",[n("strong",[t._v("display/ ")])]),t._v(" "),n("p",[n("strong",[t._v("display/ ")])]),t._v(" "),n("p",[t._v("display命令可以设置一些自动显示的变量,当程序停住时,或是在单步跟踪时,这些变量会自动显示。expr是一个表达式,fmt表示显示的格式,addr表示内存地址,当用display设定好了一个或多个表达式后,只要程序被停下来,GDB会自动显示你所设置的这些表达式的值。")]),t._v(" "),n("p",[n("strong",[t._v("undisplay ")])]),t._v(" "),n("p",[n("strong",[t._v("delete display ")])]),t._v(" "),n("p",[t._v("删除自动显示,dnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(如:2-5)。")]),t._v(" "),n("p",[n("strong",[t._v("disable display ")])]),t._v(" "),n("p",[n("strong",[t._v("enable display ")])]),t._v(" "),n("p",[t._v("disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。")]),t._v(" "),n("p",[n("strong",[t._v("info display")])]),t._v(" "),n("p",[t._v("查看display设置的自动显示的信息,包括设置的编号,表达式,是否enable。")]),t._v(" "),n("h2",{attrs:{id:"_4-2-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-2-示例"}},[t._v("#")]),t._v(" 4.2 示例")]),t._v(" "),n("p",[t._v("源代码test2.c同上")]),t._v(" "),n("h3",{attrs:{id:"_4-2-1-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-2-1-调试过程"}},[t._v("#")]),t._v(" 4.2.1 调试过程")]),t._v(" "),n("p",[t._v("启动GDB:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>gdb -q test2")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /home/luo/workspace/test/exec/test2...done.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) l 1 --------------")]),t._v(" 列出源代码")]),t._v(" "),n("p",[n("em",[t._v("1 #include ")])]),t._v(" "),n("p",[n("em",[t._v("2")])]),t._v(" "),n("p",[n("em",[t._v("3 int func(int m){")])]),t._v(" "),n("p",[n("em",[t._v("4 int n = 0;")])]),t._v(" "),n("p",[n("em",[t._v("5 int i = 0;")])]),t._v(" "),n("p",[n("em",[t._v("6 for(i = 0; i < m; i++){")])]),t._v(" "),n("p",[n("em",[t._v("7 n += m;")])]),t._v(" "),n("p",[n("em",[t._v("8 }")])]),t._v(" "),n("p",[n("em",[t._v("9")])]),t._v(" "),n("p",[n("em",[t._v("10 return n;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("11")])]),t._v(" "),n("p",[n("em",[t._v("12 }")])]),t._v(" "),n("p",[n("em",[t._v("13")])]),t._v(" "),n("p",[n("em",[t._v("14 int main(){")])]),t._v(" "),n("p",[n("em",[t._v("15 int i = 0;")])]),t._v(" "),n("p",[n("em",[t._v("16 int b = 0;")])]),t._v(" "),n("p",[n("em",[t._v("17 int n = 20;")])]),t._v(" "),n("p",[n("em",[t._v("18 int sum = 0;")])]),t._v(" "),n("p",[n("em",[t._v("19 sum = func(40);")])]),t._v(" "),n("p",[n("em",[t._v("20 for(i = 0; i < 10; i++){")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("21 n++;")])]),t._v(" "),n("p",[n("em",[t._v("22 }")])]),t._v(" "),n("p",[n("em",[t._v("23")])]),t._v(" "),n("p",[n("em",[t._v("24 return 0;")])]),t._v(" "),n("p",[n("em",[t._v("25 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) break 21 --------------")]),t._v(" 设置断点,在21行")]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1 at 0x40055f: file test2.c, line 21.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) r --------------")]),t._v(" 运行程序")]),t._v(" "),n("p",[n("em",[t._v("Starting program: /home/luo/workspace/test/exec/test2")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at test2.c:21")])]),t._v(" "),n("p",[n("em",[t._v("21 n++;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) display n --------------")]),t._v(" 跟踪变量"),n("em",[t._v("n")]),t._v("的值")]),t._v(" "),n("p",[n("em",[t._v("1: n = 20")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) display i --------------")]),t._v(" 跟踪变量"),n("em",[t._v("i")]),t._v("的值")]),t._v(" "),n("p",[n("em",[t._v("2: i = 0")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) display n+i --------------")]),t._v(" 跟踪"),n("em",[t._v("n+i")]),t._v("的值")]),t._v(" "),n("p",[n("em",[t._v("3: n+i = 20")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) display/x n --------------")]),t._v(" 跟踪"),n("em",[t._v("n")]),t._v("的值,以16进制显示")]),t._v(" "),n("p",[n("em",[t._v("4: /x n = 0x14")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) display &n --------------")]),t._v(" 跟踪"),n("em",[t._v("n")]),t._v("的地址")]),t._v(" "),n("p",[n("em",[t._v("5: &n = (int *) 0x7fffffffe0a8")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c --------------")]),t._v(" 继续运行程序")]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at test2.c:21")])]),t._v(" "),n("p",[n("em",[t._v("21 n++;")])]),t._v(" "),n("p",[n("em",[t._v("5: &n = (int *) 0x7fffffffe0a8")])]),t._v(" "),n("p",[n("em",[t._v("4: /x n = 0x15")])]),t._v(" "),n("p",[n("em",[t._v("3: n+i = 22")])]),t._v(" "),n("p",[n("em",[t._v("2: i = 1")])]),t._v(" "),n("p",[n("em",[t._v("1: n = 21")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) delete display 4 --------------")]),t._v(" 删除4号跟踪")]),t._v(" "),n("p",[n("em",[t._v("(gdb) c --------------")]),t._v(" 继续运行程序")]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at test2.c:21 ------------")]),t._v(" 可以看到,4号没了")]),t._v(" "),n("p",[n("em",[t._v("21 n++;")])]),t._v(" "),n("p",[n("em",[t._v("5: &n = (int *) 0x7fffffffe0a8")])]),t._v(" "),n("p",[n("em",[t._v("3: n+i = 24")])]),t._v(" "),n("p",[n("em",[t._v("2: i = 2")])]),t._v(" "),n("p",[n("em",[t._v("1: n = 22")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) disable display 5 --------------")]),t._v(" 使5号跟踪失效")]),t._v(" "),n("p",[n("em",[t._v("(gdb) c --------------")]),t._v(" 继续运行程序")]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at test2.c:21 -------")]),t._v(" 可以看到,5号也没显示")]),t._v(" "),n("p",[n("em",[t._v("21 n++;")])]),t._v(" "),n("p",[n("em",[t._v("3: n+i = 26")])]),t._v(" "),n("p",[n("em",[t._v("2: i = 3")])]),t._v(" "),n("p",[n("em",[t._v("1: n = 23")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) enable display 5 --------------")]),t._v(" 使5号跟踪恢复")]),t._v(" "),n("p",[n("em",[t._v("(gdb) c --------------")]),t._v(" 继续运行程序")]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at test2.c:21 ------")]),t._v(" 可以看到,5号再次显示")]),t._v(" "),n("p",[n("em",[t._v("21 n++;")])]),t._v(" "),n("p",[n("em",[t._v("5: &n = (int *) 0x7fffffffe0a8")])]),t._v(" "),n("p",[n("em",[t._v("3: n+i = 28")])]),t._v(" "),n("p",[n("em",[t._v("2: i = 4")])]),t._v(" "),n("p",[n("em",[t._v("1: n = 24")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) info display --------------")]),t._v(" 查看自动显示信息")]),t._v(" "),n("p",[n("em",[t._v("Auto-display expressions now in effect:")])]),t._v(" "),n("p",[n("em",[t._v("Num Enb Expression")])]),t._v(" "),n("p",[n("em",[t._v("5: y &n")])]),t._v(" "),n("p",[n("em",[t._v("3: y n+i")])]),t._v(" "),n("p",[n("em",[t._v("2: y i")])]),t._v(" "),n("p",[n("em",[t._v("1: y n")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) disable display 1 2 3 -----------")]),t._v(" 使1,2,3号都失效")]),t._v(" "),n("p",[n("em",[t._v("(gdb) c --------------")]),t._v(" 继续运行程序")]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at test2.c:21")])]),t._v(" "),n("p",[n("em",[t._v("21 n++;")])]),t._v(" "),n("p",[n("em",[t._v("5: &n = (int *) 0x7fffffffe0a8")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) info display --------------")]),t._v(" 查看自动显示信息")]),t._v(" "),n("p",[n("em",[t._v("Auto-display expressions now in effect:")])]),t._v(" "),n("p",[n("em",[t._v("Num Enb Expression")])]),t._v(" "),n("p",[n("em",[t._v("5: y &n")])]),t._v(" "),n("p",[n("em",[t._v("3: n n+i")])]),t._v(" "),n("p",[n("em",[t._v("2: n i")])]),t._v(" "),n("p",[n("em",[t._v("1: n n")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("ul",[n("li"),t._v(" "),n("li")]),t._v(" "),n("h1",{attrs:{id:"_5-显示-修改寄存器"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-显示-修改寄存器"}},[t._v("#")]),t._v(" 5 显示/修改寄存器")]),t._v(" "),n("h2",{attrs:{id:"_5-1-背景知识"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-1-背景知识"}},[t._v("#")]),t._v(" 5.1 背景知识")]),t._v(" "),n("p",[t._v("先明确一点,这里指的是通用寄存器(后简称寄存器)。既然是通用的,使用并没有限制;后面介绍寄存器使用规则或者惯例,只是GCC/G++的规则。因为我们想对GCC编译的C/C++序进行分析,所以了解这些规则就很有帮助。")]),t._v(" "),n("p",[t._v("在体系结构教科书中,寄存器通常被说成寄存器文件,其实就是CPU上的一块存储区域,不过更喜欢使用标识符来表示,而不是地址而已。")]),t._v(" "),n("p",[t._v("X86-64中,所有寄存器都是64位,相对32位的x86来说,标识符发生了变化,比如:从原来的%ebp变成了%rbp。为了向后兼容性,%ebp依然可以使用,不过指向了%rbp的低32位。")]),t._v(" "),n("p",[t._v("X86-64寄存器的变化,不仅体现在位数上,更加体现在寄存器数量上。新增加寄存器%r8到%r15。加上x86的原有8个,一共16个寄存器。")]),t._v(" "),n("p",[t._v("刚刚说到,寄存器集成在CPU上,存取速度比存储器快好几个数量级,寄存器多了,GCC就可以更多的使用寄存器,替换之前的存储器堆栈使用,从而大大提升性能。")]),t._v(" "),n("p",[t._v("让寄存器为己所用,就得了解它们的用途,这些用途都涉及函数调用,X86-64有16个64位寄存器,分别是:")]),t._v(" "),n("p",[t._v("%rax,%rbx,%rcx,%rdx,%rsi,%rdi,%rbp,%rsp,%r8,%r9,%r10,%r11,%r12,%r13,%r14,%r15。")]),t._v(" "),n("p",[t._v("其中:")]),t._v(" "),n("p",[t._v("%rax 作为函数返回值使用。")]),t._v(" "),n("p",[t._v("%rsp 栈指针寄存器,指向栈顶。")]),t._v(" "),n("p",[t._v("%rdi,%rsi,%rdx,%rcx,%r8,%r9 用作函数参数,依次对应第1参数,第2参数…")]),t._v(" "),n("p",[t._v("%rbx,%rbp,%r12,%r13,%14,%15 用作数据存储,遵循被调用者使用规则,简单说就是随便用,调用子函数之前要备份它,以防他被修改。")]),t._v(" "),n("p",[t._v("%r10,%r11 用作数据存储,遵循调用者使用规则,简单说就是使用之前要先保存原值。")]),t._v(" "),n("p",[n("img",{attrs:{src:"media/1e797b88a9a47d8bf638b1897e086c27.png",alt:""}})]),t._v(" "),n("h2",{attrs:{id:"_5-2-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-2-使用命令"}},[t._v("#")]),t._v(" 5.2 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("info registers")])]),t._v(" "),n("p",[t._v("查看寄存器的情况。(不包括浮点寄存器)")]),t._v(" "),n("p",[n("strong",[t._v("info all-registers")])]),t._v(" "),n("p",[t._v("查看所有寄存器的情况。(包括浮点寄存器)")]),t._v(" "),n("p",[n("strong",[t._v("info registers ")])]),t._v(" "),n("p",[t._v("查看所指定的寄存器的情况。")]),t._v(" "),n("p",[n("strong",[t._v("set $=")])]),t._v(" "),n("p",[t._v("修改寄存器的值。")]),t._v(" "),n("h2",{attrs:{id:"_5-3-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-3-示例"}},[t._v("#")]),t._v(" 5.3 示例")]),t._v(" "),n("p",[t._v("源代码test2.c同上")]),t._v(" "),n("h3",{attrs:{id:"_5-2-1-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-2-1-调试过程"}},[t._v("#")]),t._v(" 5.2.1 调试过程")]),t._v(" "),n("p",[t._v("启动GDB:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>gdb -q test2")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /home/luo/workspace/test/exec/test2...done.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) b main --------------")]),t._v(" 在main函数设置断点")]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1 at 0x40052d: file test2.c, line 15.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) r --------------")]),t._v(" 运行程序")]),t._v(" "),n("p",[n("em",[t._v("Starting program: /home/luo/workspace/test/exec/test2")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at test2.c:15")])]),t._v(" "),n("p",[n("em",[t._v("15 int i = 0;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) s --------------")]),t._v(" step单步执行")]),t._v(" "),n("p",[n("em",[t._v("16 int b = 0;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("17 int n = 20;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("18 int sum = 0;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("19 sum = func(40);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("func (m=40) at test2.c:4 --------------")]),t._v(" 进入*func()*函数了")]),t._v(" "),n("p",[n("em",[t._v("4 int n = 0;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) i all-r --------------")]),t._v(" 显示所有寄存器信息")]),t._v(" "),n("p",[n("em",[t._v("rax 0x400525 4195621")])]),t._v(" "),n("p",[n("em",[t._v("rbx 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("rcx 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("rdx 0x7fffffffe1a8 140737488347560")])]),t._v(" "),n("p",[n("em",[t._v("rsi 0x7fffffffe198 140737488347544")])]),t._v(" "),n("p",[n("em",[t._v("rdi 0x28 40")])]),t._v(" "),n("p",[n("em",[t._v("rbp 0x7fffffffe090 0x7fffffffe090")])]),t._v(" "),n("p",[n("em",[t._v("rsp 0x7fffffffe090 0x7fffffffe090")])]),t._v(" "),n("p",[n("em",[t._v("r8 0x30555a3c60 207590407264")])]),t._v(" "),n("p",[n("em",[t._v("r9 0x305360ec80 207557291136")])]),t._v(" "),n("p",[n("em",[t._v("r10 0x7fffffffdf40 140737488346944")])]),t._v(" "),n("p",[n("em",[t._v("r11 0x3055221b00 207586728704")])]),t._v(" "),n("p",[n("em",[t._v("r12 0x4003b0 4195248")])]),t._v(" "),n("p",[n("em",[t._v("r13 0x7fffffffe190 140737488347536")])]),t._v(" "),n("p",[n("em",[t._v("r14 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("r15 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("rip 0x4004f7 0x4004f7 ")])]),t._v(" "),n("p",[n("em",[t._v("eflags 0x206 [ PF IF ]")])]),t._v(" "),n("p",[n("em",[t._v("cs 0x33 51")])]),t._v(" "),n("p",[n("em",[t._v("ss 0x2b 43")])]),t._v(" "),n("p",[n("em",[t._v("ds 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("es 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("fs 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("gs 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("st0 0 (raw 0x00000000000000000000)")])]),t._v(" "),n("p",[n("em",[t._v("st1 0 (raw 0x00000000000000000000)")])]),t._v(" "),n("p",[n("em",[t._v("---Type to continue, or q to quit---q")])]),t._v(" "),n("p",[n("em",[t._v("Quit --------------")]),t._v(" 退出显示")]),t._v(" "),n("p",[n("em",[t._v("(gdb) i r --------------")]),t._v(" 显示寄存器信息,不包括浮点寄存器")]),t._v(" "),n("p",[n("em",[t._v("rax 0x400525 4195621")])]),t._v(" "),n("p",[n("em",[t._v("rbx 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("rcx 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("rdx 0x7fffffffe1a8 140737488347560")])]),t._v(" "),n("p",[n("em",[t._v("rsi 0x7fffffffe198 140737488347544")])]),t._v(" "),n("p",[n("em",[t._v("rdi 0x28 40")])]),t._v(" "),n("p",[n("em",[t._v("rbp 0x7fffffffe090 0x7fffffffe090")])]),t._v(" "),n("p",[n("em",[t._v("rsp 0x7fffffffe090 0x7fffffffe090")])]),t._v(" "),n("p",[n("em",[t._v("r8 0x30555a3c60 207590407264")])]),t._v(" "),n("p",[n("em",[t._v("r9 0x305360ec80 207557291136")])]),t._v(" "),n("p",[n("em",[t._v("r10 0x7fffffffdf40 140737488346944")])]),t._v(" "),n("p",[n("em",[t._v("r11 0x3055221b00 207586728704")])]),t._v(" "),n("p",[n("em",[t._v("r12 0x4003b0 4195248")])]),t._v(" "),n("p",[n("em",[t._v("r13 0x7fffffffe190 140737488347536")])]),t._v(" "),n("p",[n("em",[t._v("r14 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("r15 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("rip 0x4004f7 0x4004f7 ")])]),t._v(" "),n("p",[n("em",[t._v("eflags 0x206 [ PF IF ]")])]),t._v(" "),n("p",[n("em",[t._v("cs 0x33 51")])]),t._v(" "),n("p",[n("em",[t._v("ss 0x2b 43")])]),t._v(" "),n("p",[n("em",[t._v("ds 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("es 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("fs 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("gs 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) info registers rax --------------")]),t._v(" 查看指定寄存器的信息")]),t._v(" "),n("p",[n("em",[t._v("rax 0x400525 4195621")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) n --------------")]),t._v(" 单步执行")]),t._v(" "),n("p",[n("em",[t._v("5 int i = 0;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("6 for(i = 0; i < m; i++){")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("7 n += m;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) u --------------")]),t._v(" 执行直至循环结束")]),t._v(" "),n("p",[n("em",[t._v("6 for(i = 0; i < m; i++){")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("10 return n;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) i r rax --------------")]),t._v(" 查看指定寄存器"),n("em",[t._v("rax")]),t._v("信息,其存放函数返回值")]),t._v(" "),n("p",[n("em",[t._v("rax 0x28 40")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) n --------------")]),t._v(" 单步执行,此时已经return")]),t._v(" "),n("p",[n("em",[t._v("12 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) i r rax --------------")]),t._v(" 查看"),n("em",[t._v("rax")]),t._v("信息,为1600")]),t._v(" "),n("p",[n("em",[t._v("rax 0x640 1600")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) set $rax=99 --------------")]),t._v(" 将"),n("em",[t._v("rax")]),t._v("值修改为99")]),t._v(" "),n("p",[n("em",[t._v("(gdb) i r rax --------------")]),t._v(" 再查看"),n("em",[t._v("rax")]),t._v(",为99")]),t._v(" "),n("p",[n("em",[t._v("rax 0x63 99")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) n --------------")]),t._v(" 单步执行,此时已经退出函数")]),t._v(" "),n("p",[n("em",[t._v("main () at test2.c:20")])]),t._v(" "),n("p",[n("em",[t._v("20 for(i = 0; i < 10; i++){")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) p sum -----------")]),t._v(" 显示sum值,其值应为刚刚*func()*函数的返回值")]),t._v(" "),n("p",[n("em",[t._v("$1 = 99 -----------")]),t._v(" 正确")]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("h1",{attrs:{id:"_6-查看程序的堆栈"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-查看程序的堆栈"}},[t._v("#")]),t._v(" 6 查看程序的堆栈")]),t._v(" "),n("h2",{attrs:{id:"_6-1-背景知识"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-1-背景知识"}},[t._v("#")]),t._v(" 6.1 背景知识")]),t._v(" "),n("p",[t._v("当你的程序到暂停到断点处时,你需要知道的第一件事就是知道程序停在哪儿,以及通过什么样的函数调用关系到达这里的。")]),t._v(" "),n("p",[t._v("每当你的程序调用一个函数,这个函数的相关信息将会生成,该信息包括这个函数在程序中的位置,函数的参数,以及被调用的局部变量的值。这些信息保存在一个数据块中,这个数据块叫做栈框。这些栈框位于内存中称为栈的区域。")]),t._v(" "),n("p",[t._v("当你的程序断点处停止,GDB查看堆栈的命令允许你看到所有函数相关的信息。")]),t._v(" "),n("p",[t._v("栈被划分为多个连续的块,每个块称为栈框;每个栈框都存有与调用函数相关的数据。栈框中包含了调用函数的参数,调用函数的局部变量。以及这个函数的执行的地址。")]),t._v(" "),n("p",[t._v("当程序开始执行时,栈上就只有一个栈框,也就是用来描述Main函数的。这个栈框称为初始化栈框或最外层栈框。每当调用一个函数,一个新的栈框将会生成。每当一个函数结束,该函数对应的栈框将会消除。如果一个函数是递归函数,这将会对同一个函数产生很多个栈框。正在执行函数的栈框将叫做最内层栈框。这个是所有存在栈框中最新创建的。在你的程序里,栈框通过它对应到的地址进行标识。一个栈框由多个字节组成,每个栈框都有自己的地址,当程序执行到这个栈框时。通常这个栈框地址存放在特定的寄存器中。")]),t._v(" "),n("p",[t._v("gdb为每个存在的栈框赋上一个标号。标号从0开始,0表示最里层的栈框。也就是正在被调用函数的栈框。这些标号在程序中并不存在,它是由gdb赋予的,gdb通过赋予这个标号来给gdb的命令指定哪个栈框。")]),t._v(" "),n("h2",{attrs:{id:"_6-2-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-2-使用命令"}},[t._v("#")]),t._v(" 6.2 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("frame args")])]),t._v(" "),n("p",[t._v("这个frame命令允许你从一个栈框移动到另一个栈框,然后可以打印出你选择的栈框,args要么是栈框的地址,要么是栈框的标号,如果没有参数,frame命令将会打印出当前的栈框。")]),t._v(" "),n("p",[n("strong",[t._v("select -frame")])]),t._v(" "),n("p",[t._v("select -frame命令允许你从一个栈框移动到另外一个栈框而不打印栈框的信息,这个命令可以看作是frame命令的silent版本。")]),t._v(" "),n("p",[n("strong",[t._v("backtrace")])]),t._v(" "),n("p",[n("strong",[t._v("bt")])]),t._v(" "),n("p",[t._v("bt命令打印栈全部的backtrace,每个栈框显示一行。你可以在任何时间结束backtrace通过键入系统中断字符,ctrl+c。")]),t._v(" "),n("p",[n("strong",[t._v("backtrace n")])]),t._v(" "),n("p",[n("strong",[t._v("bt n")])]),t._v(" "),n("p",[t._v("bt n 命令将会显示最内层的n个栈框。")]),t._v(" "),n("p",[n("strong",[t._v("backtrace -n")])]),t._v(" "),n("p",[n("strong",[t._v("bt -n")])]),t._v(" "),n("p",[t._v("bt -n将会显示最外层的n个栈框。")]),t._v(" "),n("p",[n("strong",[t._v("backtrace full")])]),t._v(" "),n("p",[n("strong",[t._v("bt full")])]),t._v(" "),n("p",[n("strong",[t._v("bt full n")])]),t._v(" "),n("p",[n("strong",[t._v("bt full -n")])]),t._v(" "),n("p",[t._v("如果添加full这个参数的话,将会显示栈框中的局部变量。")]),t._v(" "),n("p",[n("strong",[t._v("frame n")])]),t._v(" "),n("p",[n("strong",[t._v("f n")])]),t._v(" "),n("p",[t._v("frame n(f n)将会选择栈框n,栈框0是最内层的栈框,也就是当前执行的函数,栈框1是调用最内层栈框的函数。最大的栈框就是main函数对应的栈框。")]),t._v(" "),n("p",[n("strong",[t._v("frame addr")])]),t._v(" "),n("p",[n("strong",[t._v("f addr")])]),t._v(" "),n("p",[t._v("通过栈框的地址选择栈框。如果栈框被bug破坏掉了,这将是主要的方法去查看栈框。栈框破坏掉了,gdb将不能通过栈框标号去定位栈框。另外,如果你的程序有多个栈,在多个栈切换时这中方法将很有用。")]),t._v(" "),n("p",[n("strong",[t._v("up n")])]),t._v(" "),n("p",[t._v("up n将会朝外层栈框走n个。它的方向是朝最外层的栈框,也就是最大的栈框号。")]),t._v(" "),n("p",[n("strong",[t._v("down n")])]),t._v(" "),n("p",[t._v("down n和up n是对应的,它将会朝最内层走n个栈框。")]),t._v(" "),n("p",[t._v("这些命令将会打印两行关于该栈框的信息,第一行将会显示栈框号,函数名,参数,以及源代码所在的文件名,和所在的行。")]),t._v(" "),n("h2",{attrs:{id:"_6-3-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-3-示例"}},[t._v("#")]),t._v(" 6.3 示例")]),t._v(" "),n("h3",{attrs:{id:"_6-3-1-源代码test3-c"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-3-1-源代码test3-c"}},[t._v("#")]),t._v(" 6.3.1 源代码test3.c")]),t._v(" "),n("ol",[n("li",[t._v("#include ")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" func4("),n("strong",[t._v("int")]),t._v(" m)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" ret = m - m / 2;")]),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" ret;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" func3("),n("strong",[t._v("int")]),t._v(" m)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" ret = m + func4(m);")]),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" ret;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" func2("),n("strong",[t._v("int")]),t._v(" m)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" ret = m * func3(m);")]),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" ret;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" func1("),n("strong",[t._v("int")]),t._v(" m)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" ret = func2(m) + 1;")]),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" ret;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" main()")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" m = 40;")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" n = func1(m);")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" 0;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li")]),t._v(" "),n("h3",{attrs:{id:"_6-3-2-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-3-2-调试过程"}},[t._v("#")]),t._v(" 6.3.2 调试过程")]),t._v(" "),n("p",[t._v("启动GDB:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>gdb -q test3")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /home/luo/workspace/test/exec/test3...done.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) b main --------------")]),t._v(" 在main函数设置断点")]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1 at 0x40057d: file ../source/test3.c, line 30.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) r --------------")]),t._v(" 运行程序")]),t._v(" "),n("p",[n("em",[t._v("Starting program: /home/luo/workspace/test/exec/test3")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at ../source/test3.c:30")])]),t._v(" "),n("p",[n("em",[t._v("30 int m = 40;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) s --------------")]),t._v(" step单步执行")]),t._v(" "),n("p",[n("em",[t._v("31 int n = func1(m);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) s")])]),t._v(" "),n("p",[n("em",[t._v("func1 (m=40) at ../source/test3.c:24")])]),t._v(" "),n("p",[n("em",[t._v("24 int ret = func2(m) + 1;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) s")])]),t._v(" "),n("p",[n("em",[t._v("func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("18 int ret = m * func3(m);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) s")])]),t._v(" "),n("p",[n("em",[t._v("func3 (m=40) at ../source/test3.c:11")])]),t._v(" "),n("p",[n("em",[t._v("11 int ret = m + func4(m);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) s")])]),t._v(" "),n("p",[n("em",[t._v("func4 (m=40) at ../source/test3.c:5")])]),t._v(" "),n("p",[n("em",[t._v("5 int ret = m - m / 2;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) bt --------------")]),t._v(" 显示栈信息")]),t._v(" "),n("p",[n("em",[t._v("#0 func4 (m=40) at ../source/test3.c:5")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x0000000000400527 in func3 (m=40) at ../source/test3.c:11")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x000000000040056a in func1 (m=40) at ../source/test3.c:24")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x000000000040058e in main () at ../source/test3.c:31")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) frame 2 --------------")]),t._v(" 跳到标号为2的栈框")]),t._v(" "),n("p",[n("em",[t._v("#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("18 int ret = m * func3(m);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) select-frame 2 -------------")]),t._v(" 跳到标号为2的栈框并且不打印信息")]),t._v(" "),n("p",[n("em",[t._v("(gdb) bt 3 --------------")]),t._v(" 显示最内层的3个栈框")]),t._v(" "),n("p",[n("em",[t._v("#0 func4 (m=40) at ../source/test3.c:5")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x0000000000400527 in func3 (m=40) at ../source/test3.c:11")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("(More stack frames follow...)")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) bt -3 --------------")]),t._v(" 显示最外层的3个栈框")]),t._v(" "),n("p",[n("em",[t._v("#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x000000000040056a in func1 (m=40) at ../source/test3.c:24")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x000000000040058e in main () at ../source/test3.c:31")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) bt full --------------")]),t._v(" 显示栈信息,包括局部变量")]),t._v(" "),n("p",[n("em",[t._v("#0 func4 (m=40) at ../source/test3.c:5")])]),t._v(" "),n("p",[n("em",[t._v("ret = 0")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x0000000000400527 in func3 (m=40) at ../source/test3.c:11")])]),t._v(" "),n("p",[n("em",[t._v("ret = 0")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("ret = 0")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x000000000040056a in func1 (m=40) at ../source/test3.c:24")])]),t._v(" "),n("p",[n("em",[t._v("ret = 0")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x000000000040058e in main () at ../source/test3.c:31")])]),t._v(" "),n("p",[n("em",[t._v("m = 40")])]),t._v(" "),n("p",[n("em",[t._v("n = 0")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) frame 2")]),t._v(" "),n("em",[t._v("--------------")]),t._v(" 移动到标号为2的栈框")]),t._v(" "),n("p",[n("em",[t._v("#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("18 int ret = m * func3(m);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) bt")])]),t._v(" "),n("p",[n("em",[t._v("#0 func4 (m=40) at ../source/test3.c:5")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x0000000000400527 in func3 (m=40) at ../source/test3.c:11")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x000000000040056a in func1 (m=40) at ../source/test3.c:24")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x000000000040058e in main () at ../source/test3.c:31")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) up 2 --------------")]),t._v(" 向外层栈框移动2层")]),t._v(" "),n("p",[n("em",[t._v("#4 0x000000000040058e in main () at ../source/test3.c:31")])]),t._v(" "),n("p",[n("em",[t._v("31 int n = func1(m);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) down 3 --------------")]),t._v(" 向内层栈框移动3层")]),t._v(" "),n("p",[n("em",[t._v("#1 0x0000000000400527 in func3 (m=40) at ../source/test3.c:11")])]),t._v(" "),n("p",[n("em",[t._v("11 int ret = m + func4(m);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("h1",{attrs:{id:"_7-多线程调试"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-多线程调试"}},[t._v("#")]),t._v(" 7 多线程调试")]),t._v(" "),n("h2",{attrs:{id:"_7-1-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-1-使用命令"}},[t._v("#")]),t._v(" 7.1 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("info threads")])]),t._v(" "),n("p",[t._v("查看当前进程的线程。GDB会为每个线程分配一个ID, 后面操作线程的时候会用到这个ID。前面有*的是当前调试的线程。")]),t._v(" "),n("p",[n("strong",[t._v("thread ")])]),t._v(" "),n("p",[t._v("切换调试的线程为指定ID的线程。")]),t._v(" "),n("p",[n("strong",[t._v("break file.c:number thread all")])]),t._v(" "),n("p",[t._v("在file.c文件第number行处为所有经过这里的线程设置断点。")]),t._v(" "),n("p",[n("strong",[t._v("set scheduler-locking off|on|step")])]),t._v(" "),n("p",[t._v("在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的, 怎么只让被调试程序执行呢?")]),t._v(" "),n("p",[t._v("通过这个命令就可以实现这个需求。")]),t._v(" "),n("p",[t._v("off 不锁定任何线程,也就是所有线程都执行,这是默认值。")]),t._v(" "),n("p",[t._v("on 只有当前被调试程序会执行。")]),t._v(" "),n("p",[t._v("step 在单步的时候,除了next过一个函数的情况 (熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。")]),t._v(" "),n("p",[n("strong",[t._v("thread apply ID1 ID2 command")])]),t._v(" "),n("p",[t._v("让一个或多个线程执行GDB命令command。")]),t._v(" "),n("p",[n("strong",[t._v("thread apply all command")])]),t._v(" "),n("p",[t._v("让所有被调试线程执行GDB命令command。")]),t._v(" "),n("h2",{attrs:{id:"_7-2-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-2-示例"}},[t._v("#")]),t._v(" 7.2 示例")]),t._v(" "),n("h3",{attrs:{id:"_7-2-1-源代码test4-c"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-2-1-源代码test4-c"}},[t._v("#")]),t._v(" 7.2.1 源代码test4.c")]),t._v(" "),n("ol",[n("li",[t._v("/*")]),t._v(" "),n("li",[t._v("* 本文件为多线程调试测试准备")]),t._v(" "),n("li",[t._v("*/")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("void")]),t._v(" func1()")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" i = 0;")]),t._v(" "),n("li",[n("strong",[t._v("while")]),t._v("(1){")]),t._v(" "),n("li",[t._v("i++;")]),t._v(" "),n("li",[t._v('printf("**********************************\\n");')]),t._v(" "),n("li",[t._v('printf("this is function 1!\\n");')]),t._v(" "),n("li",[t._v('printf("this is %d time!\\n", i);')]),t._v(" "),n("li",[t._v("sleep(1);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" ;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("void")]),t._v(" func2()")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" i = 0;")]),t._v(" "),n("li",[n("strong",[t._v("while")]),t._v("(1){")]),t._v(" "),n("li",[t._v("i++;")]),t._v(" "),n("li",[t._v('printf("**********************************\\n");')]),t._v(" "),n("li",[t._v('printf("this is function 2!\\n");')]),t._v(" "),n("li",[t._v('printf("this is %d time!\\n", i);')]),t._v(" "),n("li",[t._v("sleep(1);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" ;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" main()")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("pthread_t td1, td2, td3;")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" ret_td1, ret_td2, ret_td3;")]),t._v(" "),n("li"),t._v(" "),n("li",[t._v("ret_td1 = pthread_create(&td1, NULL, ("),n("strong",[t._v("void")]),t._v("*)&func1, NULL);")]),t._v(" "),n("li",[t._v("ret_td2 = pthread_create(&td2, NULL, ("),n("strong",[t._v("void")]),t._v("*)&func2, NULL);")]),t._v(" "),n("li",[t._v("ret_td3 = pthread_create(&td3, NULL, ("),n("strong",[t._v("void")]),t._v("*)&func2, NULL);")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v("(ret_td1 != 0){")]),t._v(" "),n("li",[t._v('printf("线程1创建失败\\n");')]),t._v(" "),n("li",[t._v("}"),n("strong",[t._v("else")]),t._v("{")]),t._v(" "),n("li",[t._v('printf("线程1创建成功\\n");')]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v("(ret_td2 != 0){")]),t._v(" "),n("li",[t._v('printf("线程2创建失败\\n");')]),t._v(" "),n("li",[t._v("}"),n("strong",[t._v("else")]),t._v("{")]),t._v(" "),n("li",[t._v('printf("线程2创建成功\\n");')]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v("(ret_td3 != 0){")]),t._v(" "),n("li",[t._v('printf("线程3创建失败\\n");')]),t._v(" "),n("li",[t._v("}"),n("strong",[t._v("else")]),t._v("{")]),t._v(" "),n("li",[t._v('printf("线程3创建成功\\n");')]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" 0;")]),t._v(" "),n("li",[t._v("}")])]),t._v(" "),n("h3",{attrs:{id:"_7-2-2-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-2-2-调试过程"}},[t._v("#")]),t._v(" 7.2.2 调试过程")]),t._v(" "),n("p",[t._v("编译生成可执行文件,注意带上 "),n("em",[t._v("-lpthread")]),t._v(" :")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>gcc -g ../source/test4.c -o test4 -lpthread")])]),t._v(" "),n("p",[t._v("启动GDB:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>gdb -q test4")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /home/luo/workspace/test/exec/test4...done.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) b main --------------")]),t._v(" 在main()函数设置断点")]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1 at 0x400776: file ../source/test4.c, line 42.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) l 1 --------------")]),t._v(" 列出源代码")]),t._v(" "),n("p",[n("em",[t._v("1 /*")])]),t._v(" "),n("p",[n("em",[t._v("2 * 本文件为多线程调试测试准备")])]),t._v(" "),n("p",[n("em",[t._v("3 */")])]),t._v(" "),n("p",[n("em",[t._v("4 #include ")])]),t._v(" "),n("p",[n("em",[t._v("5 #include ")])]),t._v(" "),n("p",[n("em",[t._v("6 #include ")])]),t._v(" "),n("p",[n("em",[t._v("7 #include ")])]),t._v(" "),n("p",[n("em",[t._v("8")])]),t._v(" "),n("p",[n("em",[t._v("9 void func1()")])]),t._v(" "),n("p",[n("em",[t._v("10 {")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("11 int i = 0;")])]),t._v(" "),n("p",[n("em",[t._v("12 while(1){")])]),t._v(" "),n("p",[n("em",[t._v("13 i++;")])]),t._v(" "),n("p",[n("em",[t._v('14 printf("**********************************\\n");')])]),t._v(" "),n("p",[n("em",[t._v('15 printf("this is function 1!\\n");')])]),t._v(" "),n("p",[n("em",[t._v('16 printf("this is %d time!\\n", i);')])]),t._v(" "),n("p",[n("em",[t._v("17 sleep(1);")])]),t._v(" "),n("p",[n("em",[t._v("18 }")])]),t._v(" "),n("p",[n("em",[t._v("19")])]),t._v(" "),n("p",[n("em",[t._v("20 return ;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("21 }")])]),t._v(" "),n("p",[n("em",[t._v("22")])]),t._v(" "),n("p",[n("em",[t._v("23 void func2()")])]),t._v(" "),n("p",[n("em",[t._v("24 {")])]),t._v(" "),n("p",[n("em",[t._v("25 int i = 0;")])]),t._v(" "),n("p",[n("em",[t._v("26 while(1){")])]),t._v(" "),n("p",[n("em",[t._v("27 i++;")])]),t._v(" "),n("p",[n("em",[t._v('28 printf("**********************************\\n");')])]),t._v(" "),n("p",[n("em",[t._v('29 printf("this is function 2!\\n");')])]),t._v(" "),n("p",[n("em",[t._v('30 printf("this is %d time!\\n", i);')])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("31 sleep(1);")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("33 return ;")])]),t._v(" "),n("p",[n("em",[t._v("34 }")])]),t._v(" "),n("p",[n("em",[t._v("35")])]),t._v(" "),n("p",[n("em",[t._v("36")])]),t._v(" "),n("p",[n("em",[t._v("37 int main()")])]),t._v(" "),n("p",[n("em",[t._v("38 {")])]),t._v(" "),n("p",[n("em",[t._v("39 pthread_t td1, td2, td3;")])]),t._v(" "),n("p",[n("em",[t._v("40 int ret_td1, ret_td2, ret_td3;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("41")])]),t._v(" "),n("p",[n("em",[t._v("42 ret_td1 = pthread_create(&td1, NULL, (void*)&func1, NULL);")])]),t._v(" "),n("p",[n("em",[t._v("43 ret_td2 = pthread_create(&td2, NULL, (void*)&func2, NULL);")])]),t._v(" "),n("p",[n("em",[t._v("44 ret_td3 = pthread_create(&td3, NULL, (void*)&func2, NULL);")])]),t._v(" "),n("p",[n("em",[t._v("45")])]),t._v(" "),n("p",[n("em",[t._v("46 if(ret_td1 != 0){")])]),t._v(" "),n("p",[n("em",[t._v('47 printf("线程1创建失败\\n");')])]),t._v(" "),n("p",[n("em",[t._v("48 }else{")])]),t._v(" "),n("p",[n("em",[t._v('49 printf("线程1创建成功\\n");')])]),t._v(" "),n("p",[n("em",[t._v("50 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("51")])]),t._v(" "),n("p",[n("em",[t._v("52 if(ret_td2 != 0){")])]),t._v(" "),n("p",[n("em",[t._v('53 printf("线程2创建失败\\n");')])]),t._v(" "),n("p",[n("em",[t._v("54 }else{")])]),t._v(" "),n("p",[n("em",[t._v('55 printf("线程2创建成功\\n");')])]),t._v(" "),n("p",[n("em",[t._v("56 }")])]),t._v(" "),n("p",[n("em",[t._v("57")])]),t._v(" "),n("p",[n("em",[t._v("58 if(ret_td3 != 0){")])]),t._v(" "),n("p",[n("em",[t._v('59 printf("线程3创建失败\\n");')])]),t._v(" "),n("p",[n("em",[t._v("60 }else{")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v('61 printf("线程3创建成功\\n");')])]),t._v(" "),n("p",[n("em",[t._v("62 }")])]),t._v(" "),n("p",[n("em",[t._v("63")])]),t._v(" "),n("p",[n("em",[t._v("64 return 0;")])]),t._v(" "),n("p",[n("em",[t._v("65 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) b 18 --------------")]),t._v(" 在18行设置断点")]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 2 at 0x400725: file ../source/test4.c, line 18.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) b 32 --------------")]),t._v(" 在32行设置断点")]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3 at 0x40076c: file ../source/test4.c, line 32.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) b 46 --------------")]),t._v(" 在46行设置断点")]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 4 at 0x4007d0: file ../source/test4.c, line 46.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) r --------------")]),t._v(" 运行程序")]),t._v(" "),n("p",[n("em",[t._v("Starting program: /home/luo/workspace/test/exec/test4")])]),t._v(" "),n("p",[n("em",[t._v("[Thread debugging using libthread_db enabled]")])]),t._v(" "),n("p",[n("em",[t._v('Using host libthread_db library "/lib64/libthread_db.so.1".')])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at ../source/test4.c:42")])]),t._v(" "),n("p",[n("em",[t._v("42 ret_td1 = pthread_create(&td1, NULL, (void*)&func1, NULL);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) info threads --------------")]),t._v(" 查看线程信息,目前只有一个主线程")]),t._v(" "),n("p",[n("em",[t._v("Id Target Id Frame")])]),t._v(" "),n("p",[n("em",[t._v('* 1 Thread 0x7ffff7dd2700 (LWP 40907) "test4" main ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../source/test4.c:42")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c --------------")]),t._v(" 继续运行程序")]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("[New Thread 0x7ffff7dd0700 (LWP 40913)] --------------")]),t._v(" 新线程创建")]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("[New Thread 0x7ffff75cf700 (LWP 40914)] --------------")]),t._v(" 新线程创建")]),t._v(" "),n("p",[n("em",[t._v("this is function 1!")])]),t._v(" "),n("p",[n("em",[t._v("this is 1 time!")])]),t._v(" "),n("p",[n("em",[t._v("[New Thread 0x7ffff6dce700 (LWP 40915)] --------------")]),t._v(" 新线程创建")]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 4, main () at ../source/test4.c:46")])]),t._v(" "),n("p",[n("em",[t._v("46 if(ret_td1 != 0){")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) info threads --------------")]),t._v(" 查看线程信息")]),t._v(" "),n("p",[n("em",[t._v("Id Target Id Frame")])]),t._v(" "),n("p",[n("em",[t._v('4 Thread 0x7ffff6dce700 (LWP 40915) "test4" 0x00000030552d795d in write () from /lib64/libc.so.6')])]),t._v(" "),n("p",[n("em",[t._v('3 Thread 0x7ffff75cf700 (LWP 40914) "test4" __lll_lock_wait_private ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95")])]),t._v(" "),n("p",[n("em",[t._v('2 Thread 0x7ffff7dd0700 (LWP 40913) "test4" 0x00000030552b5a0d in nanosleep () from /lib64/libc.so.6')])]),t._v(" "),n("p",[n("em",[t._v('* 1 Thread 0x7ffff7dd2700 (LWP 40907) "test4" main ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../source/test4.c:46")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) set scheduler-locking on --------------")]),t._v(" 设置调试模式为只有当前线程会被执行")]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread 4 --------------")]),t._v(" 切换到4号线程")]),t._v(" "),n("p",[n("em",[t._v("[Switching to thread 4 (Thread 0x7ffff6dce700 (LWP 40915))]")])]),t._v(" "),n("p",[n("em",[t._v("#0 0x00000030552d795d in write () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c --------------")]),t._v(" 当前线程执行continue")]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("this is function 2!")])]),t._v(" "),n("p",[n("em",[t._v("this is 1 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3, func2 () at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 2!")])]),t._v(" "),n("p",[n("em",[t._v("this is 2 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3, func2 () at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread 3 --------------")]),t._v(" 切换线程")]),t._v(" "),n("p",[n("em",[t._v("[Switching to thread 3 (Thread 0x7ffff75cf700 (LWP 40914))]")])]),t._v(" "),n("p",[n("em",[t._v("#0 __lll_lock_wait_private ()")])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95")])]),t._v(" "),n("p",[n("em",[t._v("95 ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: No such file or directory.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 2!")])]),t._v(" "),n("p",[n("em",[t._v("this is 1 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3, func2 () at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 2!")])]),t._v(" "),n("p",[n("em",[t._v("this is 2 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3, func2 () at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread 2 --------------")]),t._v(" 切换线程")]),t._v(" "),n("p",[n("em",[t._v("[Switching to thread 2 (Thread 0x7ffff7dd0700 (LWP 40913))]")])]),t._v(" "),n("p",[n("em",[t._v("#0 0x00000030552f081b in ?? () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 1!")])]),t._v(" "),n("p",[n("em",[t._v("this is 2 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 2, func1 () at ../source/test4.c:18")])]),t._v(" "),n("p",[n("em",[t._v("18 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 1!")])]),t._v(" "),n("p",[n("em",[t._v("this is 3 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 2, func1 () at ../source/test4.c:18")])]),t._v(" "),n("p",[n("em",[t._v("18 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) info threads --------------")]),t._v(" 查看线程信息,当前位于2号线程")]),t._v(" "),n("p",[n("em",[t._v("Id Target Id Frame")])]),t._v(" "),n("p",[n("em",[t._v('4 Thread 0x7ffff6dce700 (LWP 40915) "test4" func2 ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v('3 Thread 0x7ffff75cf700 (LWP 40914) "test4" func2 ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v('* 2 Thread 0x7ffff7dd0700 (LWP 40913) "test4" func1 ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../source/test4.c:18")])]),t._v(" "),n("p",[n("em",[t._v('1 Thread 0x7ffff7dd2700 (LWP 40907) "test4" main ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../source/test4.c:46")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread apply 2 4 continue -----")]),t._v(" 令2号和4号线程执行continue")]),t._v(" "),n("p",[n("em",[t._v("Thread 2 (Thread 0x7ffff7dd0700 (LWP 40913)):")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 1!")])]),t._v(" "),n("p",[n("em",[t._v("this is 4 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 2, func1 () at ../source/test4.c:18")])]),t._v(" "),n("p",[n("em",[t._v("18 }")])]),t._v(" "),n("p",[n("em",[t._v("Thread 4 (Thread 0x7ffff6dce700 (LWP 40915)):")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 2!")])]),t._v(" "),n("p",[n("em",[t._v("this is 3 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3, func2 () at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread apply all continue -------------")]),t._v(" 所有线程执行continue")]),t._v(" "),n("p",[n("em",[t._v("Thread 4 (Thread 0x7ffff6dce700 (LWP 40915)):")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 2!")])]),t._v(" "),n("p",[n("em",[t._v("this is 4 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3, func2 () at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("Thread 3 (Thread 0x7ffff75cf700 (LWP 40914)):")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 2!")])]),t._v(" "),n("p",[n("em",[t._v("this is 3 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3, func2 () at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("Thread 2 (Thread 0x7ffff7dd0700 (LWP 40913)):")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 1!")])]),t._v(" "),n("p",[n("em",[t._v("this is 5 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 2, func1 () at ../source/test4.c:18")])]),t._v(" "),n("p",[n("em",[t._v("18 }")])]),t._v(" "),n("p",[n("em",[t._v("Thread 1 (Thread 0x7ffff7dd2700 (LWP 40907)):")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("线程1创建成功")])]),t._v(" "),n("p",[n("em",[t._v("线程2创建成功")])]),t._v(" "),n("p",[n("em",[t._v("线程3创建成功")])]),t._v(" "),n("p",[n("em",[t._v("[Thread 0x7ffff6dce700 (LWP 40915) exited]")])]),t._v(" "),n("p",[n("em",[t._v("[Thread 0x7ffff75cf700 (LWP 40914) exited]")])]),t._v(" "),n("p",[n("em",[t._v("[Thread 0x7ffff7dd0700 (LWP 40913) exited]")])]),t._v(" "),n("p",[n("em",[t._v("[Inferior 1 (process 40907) exited normally]")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("h1",{attrs:{id:"_8-死锁调试"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_8-死锁调试"}},[t._v("#")]),t._v(" 8 死锁调试")]),t._v(" "),n("h2",{attrs:{id:"_8-1-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_8-1-使用命令"}},[t._v("#")]),t._v(" 8.1 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("ps -ef|grep ")])]),t._v(" "),n("p",[t._v("查看进程号,其中processname为进程名。")]),t._v(" "),n("p",[n("strong",[t._v("gdb attach ")])]),t._v(" "),n("p",[t._v("使用GDB调试正在运行的进程。")]),t._v(" "),n("h2",{attrs:{id:"_8-2-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_8-2-示例"}},[t._v("#")]),t._v(" 8.2 示例")]),t._v(" "),n("h3",{attrs:{id:"_8-2-1-源文件test5-c"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_8-2-1-源文件test5-c"}},[t._v("#")]),t._v(" 8.2.1 源文件test5.c")]),t._v(" "),n("ol",[n("li",[t._v("/*")]),t._v(" "),n("li",[t._v("*本文件用于测试死锁调试")]),t._v(" "),n("li",[t._v("*")]),t._v(" "),n("li",[t._v("*代码来自网络:http://blog.chinaunix.net/uid-30343738-id-5757210.html")]),t._v(" "),n("li",[t._v("*")]),t._v(" "),n("li",[t._v("*/")]),t._v(" "),n("li"),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li"),t._v(" "),n("li",[t._v("pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;")]),t._v(" "),n("li",[t._v("pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;")]),t._v(" "),n("li",[t._v("pthread_mutex_t mutex3 = PTHREAD_MUTEX_INITIALIZER;")]),t._v(" "),n("li",[t._v("pthread_mutex_t mutex4 = PTHREAD_MUTEX_INITIALIZER;")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("static")]),t._v(" "),n("strong",[t._v("int")]),t._v(" sequence1 = 0;")]),t._v(" "),n("li",[n("strong",[t._v("static")]),t._v(" "),n("strong",[t._v("int")]),t._v(" sequence2 = 0;")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" func1()")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("pthread_mutex_lock(&mutex1);")]),t._v(" "),n("li",[t._v("++sequence1;")]),t._v(" "),n("li",[t._v("sleep(1);")]),t._v(" "),n("li",[t._v("pthread_mutex_lock(&mutex2);")]),t._v(" "),n("li",[t._v("++sequence2;")]),t._v(" "),n("li",[t._v("pthread_mutex_unlock(&mutex2);")]),t._v(" "),n("li",[t._v("pthread_mutex_unlock(&mutex1);")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" sequence1;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" func2()")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("pthread_mutex_lock(&mutex2);")]),t._v(" "),n("li",[t._v("++sequence2;")]),t._v(" "),n("li",[t._v("sleep(1);")]),t._v(" "),n("li",[t._v("pthread_mutex_lock(&mutex1);")]),t._v(" "),n("li",[t._v("++sequence1;")]),t._v(" "),n("li",[t._v("pthread_mutex_unlock(&mutex1);")]),t._v(" "),n("li",[t._v("pthread_mutex_unlock(&mutex2);")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" sequence2;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("void")]),t._v("* thread1("),n("strong",[t._v("void")]),t._v("* arg)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("while")]),t._v(" (1)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" iRetValue = func1();")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v(" (iRetValue == 100000)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("pthread_exit(NULL);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("void")]),t._v("* thread2("),n("strong",[t._v("void")]),t._v("* arg)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("while")]),t._v(" (1)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" iRetValue = func2();")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v(" (iRetValue == 100000)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("pthread_exit(NULL);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("void")]),t._v("* thread3("),n("strong",[t._v("void")]),t._v("* arg)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("while")]),t._v(" (1)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("sleep(1);")]),t._v(" "),n("li",[n("strong",[t._v("char")]),t._v(" szBuf[128];")]),t._v(" "),n("li",[t._v("memset(szBuf, 0, "),n("strong",[t._v("sizeof")]),t._v("(szBuf));")]),t._v(" "),n("li",[t._v('strcpy(szBuf, "thread3");')]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("void")]),t._v("* thread4("),n("strong",[t._v("void")]),t._v("* arg)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("while")]),t._v(" (1)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("sleep(1);")]),t._v(" "),n("li",[n("strong",[t._v("char")]),t._v(" szBuf[128];")]),t._v(" "),n("li",[t._v("memset(szBuf, 0, "),n("strong",[t._v("sizeof")]),t._v("(szBuf));")]),t._v(" "),n("li",[t._v('strcpy(szBuf, "thread3");')]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" main()")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("pthread_t tid[4];")]),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v(" (pthread_create(&tid[0], NULL, &thread1, NULL) != 0)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("_exit(1);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v(" (pthread_create(&tid[1], NULL, &thread2, NULL) != 0)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("_exit(1);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v(" (pthread_create(&tid[2], NULL, &thread3, NULL) != 0)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("_exit(1);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v(" (pthread_create(&tid[3], NULL, &thread4, NULL) != 0)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("_exit(1);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[t._v("sleep(5);")]),t._v(" "),n("li",[t._v("//pthread_cancel(tid[0]);")]),t._v(" "),n("li"),t._v(" "),n("li",[t._v("pthread_join(tid[0], NULL);")]),t._v(" "),n("li",[t._v("pthread_join(tid[1], NULL);")]),t._v(" "),n("li",[t._v("pthread_join(tid[2], NULL);")]),t._v(" "),n("li",[t._v("pthread_join(tid[3], NULL);")]),t._v(" "),n("li"),t._v(" "),n("li",[t._v("pthread_mutex_destroy(&mutex1);")]),t._v(" "),n("li",[t._v("pthread_mutex_destroy(&mutex2);")]),t._v(" "),n("li",[t._v("pthread_mutex_destroy(&mutex3);")]),t._v(" "),n("li",[t._v("pthread_mutex_destroy(&mutex4);")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" 0;")]),t._v(" "),n("li",[t._v("}")])]),t._v(" "),n("h3",{attrs:{id:"_8-2-2-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_8-2-2-调试过程"}},[t._v("#")]),t._v(" 8.2.2 调试过程")]),t._v(" "),n("p",[t._v("执行程序,程序会卡在这里:")]),t._v(" "),n("p",[n("a",{attrs:{href:"mailto:root@luo:~/workspace/test/exec%3e./test5"}},[n("em",[t._v("root@luo:~/workspace/test/exec\\>./test5")])])]),t._v(" "),n("p",[t._v("另开一个终端,查看进程的信息:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>ps -ef|grep test5")])]),t._v(" "),n("p",[n("em",[t._v("root 42746 39442 0 14:25 ttyp0 00:00:00 ./test5")])]),t._v(" "),n("p",[n("em",[t._v("root 43464 42753 0 15:11 ttyp2 00:00:00 grep --color=auto test5")])]),t._v(" "),n("p",[t._v("使用GDB工具attach该进程:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>gdb -q attach 42746")])]),t._v(" "),n("p",[n("em",[t._v("attach: No such file or directory.")])]),t._v(" "),n("p",[n("em",[t._v("Attaching to process 42746")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /home/luo/workspace/test/exec/test5...done.")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /lib64/libpthread.so.0...done.")])]),t._v(" "),n("p",[n("em",[t._v("[New LWP 42750]")])]),t._v(" "),n("p",[n("em",[t._v("[New LWP 42749]")])]),t._v(" "),n("p",[n("em",[t._v("[New LWP 42748]")])]),t._v(" "),n("p",[n("em",[t._v("[New LWP 42747]")])]),t._v(" "),n("p",[n("em",[t._v("[Thread debugging using libthread_db enabled]")])]),t._v(" "),n("p",[n("em",[t._v('Using host libthread_db library "/lib64/libthread_db.so.1".')])]),t._v(" "),n("p",[n("em",[t._v("Loaded symbols for /lib64/libpthread.so.0")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.")])]),t._v(" "),n("p",[n("em",[t._v("Loaded symbols for /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.")])]),t._v(" "),n("p",[n("em",[t._v("Loaded symbols for /lib64/ld-linux-x86-64.so.2")])]),t._v(" "),n("p",[n("em",[t._v("0x00007fc3aa9ff492 in pthread_join (threadid=140478357907200, thread_return=0x0)")])]),t._v(" "),n("p",[n("em",[t._v("at pthread_join.c:92")])]),t._v(" "),n("p",[n("em",[t._v("92 pthread_join.c: No such file or directory.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) info threads -------------")]),t._v(" 查看线程信息")]),t._v(" "),n("p",[n("em",[t._v("Id Target Id Frame")])]),t._v(" "),n("p",[n("em",[t._v('5 Thread 0x7fc3aa9f2700 (LWP 42747) "test5" __lll_lock_wait ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v('4 Thread 0x7fc3aa1f1700 (LWP 42748) "test5" __lll_lock_wait ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v('3 Thread 0x7fc3a99f0700 (LWP 42749) "test5" 0x00000030552b5a0d in nanosleep')])]),t._v(" "),n("p",[n("em",[t._v("() from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v('2 Thread 0x7fc3a91ef700 (LWP 42750) "test5" 0x00000030552b5a0d in nanosleep')])]),t._v(" "),n("p",[n("em",[t._v("() from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v('* 1 Thread 0x7fc3aa9f4700 (LWP 42746) "test5" 0x00007fc3aa9ff492 in pthread_join (threadid=140478357907200, thread_return=0x0) at pthread_join.c:92')])]),t._v(" "),n("p",[n("em",[t._v("(gdb) set scheduler-locking on ---------")]),t._v(" 设置调试模式为只有当前线程会执行")]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread apply all bt -------------")]),t._v(" 显示所有线程的栈信息")]),t._v(" "),n("p",[n("em",[t._v("Thread 5 (Thread 0x7fc3aa9f2700 (LWP 42747)):")])]),t._v(" "),n("p",[n("em",[t._v("#0 __lll_lock_wait ()")])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x00007fc3aaa00457 in _L_lock_913 () from /lib64/libpthread.so.0")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x00007fc3aaa00280 in __GI___pthread_mutex_lock (mutex=0x6012c0 )")])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/pthread_mutex_lock.c:79")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x00000000004008b1 in func1 () at test5.c:27")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x000000000040094e in thread1 (arg=0x0) at test5.c:52")])]),t._v(" "),n("p",[n("em",[t._v("#5 0x00007fc3aa9fe092 in start_thread (arg=0x7fc3aa9f2700)")])]),t._v(" "),n("p",[n("em",[t._v("at pthread_create.c:309")])]),t._v(" "),n("p",[n("em",[t._v("#6 0x00000030552e42bd in clone () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("Thread 4 (Thread 0x7fc3aa1f1700 (LWP 42748)):")])]),t._v(" "),n("p",[n("em",[t._v("#0 __lll_lock_wait ()")])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x00007fc3aaa00457 in _L_lock_913 () from /lib64/libpthread.so.0")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x00007fc3aaa00280 in __GI___pthread_mutex_lock (mutex=0x601280 )")])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/pthread_mutex_lock.c:79")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x000000000040090d in func2 () at test5.c:40")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x000000000040097c in thread2 (arg=0x0) at test5.c:65")])]),t._v(" "),n("p",[n("em",[t._v("#5 0x00007fc3aa9fe092 in start_thread (arg=0x7fc3aa1f1700)")])]),t._v(" "),n("p",[n("em",[t._v("at pthread_create.c:309")])]),t._v(" "),n("p",[n("em",[t._v("#6 0x00000030552e42bd in clone () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("Thread 3 (Thread 0x7fc3a99f0700 (LWP 42749)):")])]),t._v(" "),n("p",[n("em",[t._v("#0 0x00000030552b5a0d in nanosleep () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x00000030552b58a4 in sleep () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x00000000004009b0 in thread3 (arg=0x0) at test5.c:78")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x00007fc3aa9fe092 in start_thread (arg=0x7fc3a99f0700)")])]),t._v(" "),n("p",[n("em",[t._v("at pthread_create.c:309")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x00000030552e42bd in clone () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("Thread 2 (Thread 0x7fc3a91ef700 (LWP 42750)):")])]),t._v(" "),n("p",[n("em",[t._v("#0 0x00000030552b5a0d in nanosleep () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x00000030552b58a4 in sleep () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x00000000004009f5 in thread4 (arg=0x0) at test5.c:89")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x00007fc3aa9fe092 in start_thread (arg=0x7fc3a91ef700)")])]),t._v(" "),n("p",[n("em",[t._v("at pthread_create.c:309")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x00000030552e42bd in clone () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("---Type to continue, or q to quit---")])]),t._v(" "),n("p",[n("em",[t._v("Thread 1 (Thread 0x7fc3aa9f4700 (LWP 42746)):")])]),t._v(" "),n("p",[n("em",[t._v("#0 0x00007fc3aa9ff492 in pthread_join (threadid=140478357907200,")])]),t._v(" "),n("p",[n("em",[t._v("thread_return=0x0) at pthread_join.c:92")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x0000000000400af1 in main () at test5.c:119")])]),t._v(" "),n("p",[t._v("从栈信息可以初步判断,有可能是4号和5号线程锁住了。")]),t._v(" "),n("p",[t._v("查看27行和40行源文件的代码:")]),t._v(" "),n("p",[n("em",[t._v("(gdb) l test5.c:27")])]),t._v(" "),n("p",[n("em",[t._v("22 int func1()")])]),t._v(" "),n("p",[n("em",[t._v("23 {")])]),t._v(" "),n("p",[n("em",[t._v("24 pthread_mutex_lock(&mutex1);")])]),t._v(" "),n("p",[n("em",[t._v("25 ++sequence1;")])]),t._v(" "),n("p",[n("em",[t._v("26 sleep(1);")])]),t._v(" "),n("p",[n("em",[t._v("27 pthread_mutex_lock(&mutex2);")])]),t._v(" "),n("p",[n("em",[t._v("28 ++sequence2;")])]),t._v(" "),n("p",[n("em",[t._v("29 pthread_mutex_unlock(&mutex2);")])]),t._v(" "),n("p",[n("em",[t._v("30 pthread_mutex_unlock(&mutex1);")])]),t._v(" "),n("p",[n("em",[t._v("31")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) l test5.c:40")])]),t._v(" "),n("p",[n("em",[t._v("35 int func2()")])]),t._v(" "),n("p",[n("em",[t._v("36 {")])]),t._v(" "),n("p",[n("em",[t._v("37 pthread_mutex_lock(&mutex2);")])]),t._v(" "),n("p",[n("em",[t._v("38 ++sequence2;")])]),t._v(" "),n("p",[n("em",[t._v("39 sleep(1);")])]),t._v(" "),n("p",[n("em",[t._v("40 pthread_mutex_lock(&mutex1);")])]),t._v(" "),n("p",[n("em",[t._v("41 ++sequence1;")])]),t._v(" "),n("p",[n("em",[t._v("42 pthread_mutex_unlock(&mutex1);")])]),t._v(" "),n("p",[n("em",[t._v("43 pthread_mutex_unlock(&mutex2);")])]),t._v(" "),n("p",[n("em",[t._v("44")])]),t._v(" "),n("p",[t._v("看一下4号和5号线程是不是锁住了:")]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread 5 -------------")]),t._v(" 切换到5号线程")]),t._v(" "),n("p",[n("em",[t._v("[Switching to thread 5 (Thread 0x7fc3aa9f2700 (LWP 42747))]")])]),t._v(" "),n("p",[n("em",[t._v("#0 __lll_lock_wait ()")])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v("135 ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: No such file or directory.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) n -------------")]),t._v(" 执行下一步,卡住,Ctrl+C跳出")]),t._v(" "),n("p",[n("em",[t._v("^C")])]),t._v(" "),n("p",[n("em",[t._v("Program received signal SIGINT, Interrupt.")])]),t._v(" "),n("p",[n("em",[t._v("__lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v("135 in ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread 2 -------------")]),t._v(" 切换到2号线程")]),t._v(" "),n("p",[n("em",[t._v("[Switching to thread 2 (Thread 0x7fc3a91ef700 (LWP 42750))]")])]),t._v(" "),n("p",[n("em",[t._v("#0 0x00000030552b5a0d in nanosleep () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) n -------------")]),t._v(" 执行下一步,可正常执行")]),t._v(" "),n("p",[n("em",[t._v("Single stepping until exit from function nanosleep,")])]),t._v(" "),n("p",[n("em",[t._v("which has no line number information.")])]),t._v(" "),n("p",[n("em",[t._v("0x00000030552b58a4 in sleep () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) n")])]),t._v(" "),n("p",[n("em",[t._v("Single stepping until exit from function sleep,")])]),t._v(" "),n("p",[n("em",[t._v("which has no line number information.")])]),t._v(" "),n("p",[n("em",[t._v("thread4 (arg=0x0) at test5.c:91")])]),t._v(" "),n("p",[n("em",[t._v("91 memset(szBuf, 0, sizeof(szBuf));")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread 4 -------------")]),t._v(" 切换到4号线程")]),t._v(" "),n("p",[n("em",[t._v("[Switching to thread 4 (Thread 0x7fc3aa1f1700 (LWP 42748))]")])]),t._v(" "),n("p",[n("em",[t._v("#0 __lll_lock_wait ()")])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v("135 ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: No such file or directory.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) n -------------")]),t._v(" 执行下一步,卡住")]),t._v(" "),n("p",[n("em",[t._v("^C^C")])]),t._v(" "),n("p",[n("em",[t._v("Program received signal SIGINT, Interrupt.")])]),t._v(" "),n("p",[n("em",[t._v("__lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v("135 in ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[t._v("以上方法可调试找出程序中出现死锁的地方。")]),t._v(" "),n("h1",{attrs:{id:"_9-core文件调试"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_9-core文件调试"}},[t._v("#")]),t._v(" 9 core文件调试")]),t._v(" "),n("h2",{attrs:{id:"_9-1-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_9-1-使用命令"}},[t._v("#")]),t._v(" 9.1 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("ulimit -c")])]),t._v(" "),n("p",[t._v("查看core文件生成的大小限制,若为0,则表示不会生成core文件。(注:ulimit不会影响其他shell终端)")]),t._v(" "),n("p",[n("strong",[t._v("ulimit -c ")])]),t._v(" "),n("p",[t._v("设置core文件生成的大小。")]),t._v(" "),n("p",[n("strong",[t._v("cat /proc/sys/kernel/core_pattern")])]),t._v(" "),n("p",[t._v("查看core文件路径。")]),t._v(" "),n("p",[n("strong",[t._v("gdb ")])]),t._v(" "),n("p",[t._v("调试core文件")]),t._v(" "),n("h2",{attrs:{id:"_9-2-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_9-2-示例"}},[t._v("#")]),t._v(" 9.2 示例")]),t._v(" "),n("h3",{attrs:{id:"_9-2-1-源代码test6-c"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_9-2-1-源代码test6-c"}},[t._v("#")]),t._v(" 9.2.1 源代码test6.c")]),t._v(" "),n("p",[t._v("一个能产生core dump的程序")]),t._v(" "),n("ol",[n("li",[t._v("#include ")]),t._v(" "),n("li",[n("strong",[t._v("static")]),t._v(" "),n("strong",[t._v("void")]),t._v(" sub("),n("strong",[t._v("void")]),t._v(");")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" main("),n("strong",[t._v("void")]),t._v(")")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("sub();")]),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" 0;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[n("strong",[t._v("static")]),t._v(" "),n("strong",[t._v("void")]),t._v(" sub("),n("strong",[t._v("void")]),t._v(")")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" *p = NULL;")]),t._v(" "),n("li",[t._v("/* derefernce a null pointer, expect coredump. */")]),t._v(" "),n("li",[t._v('printf("%d", *p);')]),t._v(" "),n("li",[t._v("}")])]),t._v(" "),n("h3",{attrs:{id:"_9-2-2-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_9-2-2-调试过程"}},[t._v("#")]),t._v(" 9.2.2 调试过程")]),t._v(" "),n("p",[t._v("查看core文件是否开启:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>ulimit -c")])]),t._v(" "),n("p",[n("em",[t._v("0")])]),t._v(" "),n("p",[t._v("设置core文件大小:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>ulimit -c 1024")])]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>ulimit -c")])]),t._v(" "),n("p",[n("em",[t._v("1024")])]),t._v(" "),n("p",[t._v("查看core文件路径:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>cat /proc/sys/kernel/core_pattern")])]),t._v(" "),n("p",[n("em",[t._v("/SE/core-%e-%p")])]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>ls /SE")])]),t._v(" "),n("p",[n("em",[t._v("ai core--22330 core--4231 log ngtp_agent web_disk")])]),t._v(" "),n("p",[n("em",[t._v("core--21300 core--23374 core--5227 mysql mp.log")])]),t._v(" "),n("p",[t._v("执行程序,生成core文件:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>./test6")])]),t._v(" "),n("p",[n("em",[t._v("Segmentation fault (core dumped)")])]),t._v(" "),n("p",[t._v("查看是否生成core文件:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>ls /SE")])]),t._v(" "),n("p",[n("em",[t._v("ai core--23374 core-test6-44938 ngtp_agent")])]),t._v(" "),n("p",[n("em",[t._v("core--21300 core--4231 log mp.log")])]),t._v(" "),n("p",[n("em",[t._v("core--22330 core--5227 mysql web_disk")])]),t._v(" "),n("p",[t._v("使用GDB调试:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>gdb -q test6 /SE/core-test6-44938")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /home/luo/workspace/test/exec/test6...done.")])]),t._v(" "),n("p",[n("em",[t._v("[New LWP 44938]")])]),t._v(" "),n("p",[n("em",[t._v("Core was generated by `./test6'.")])]),t._v(" "),n("p",[n("em",[t._v("Program terminated with signal 11, Segmentation fault.")])]),t._v(" "),n("p",[n("em",[t._v("#0 0x0000000000400554 in sub () at test6.c:12")])]),t._v(" "),n("p",[n("em",[t._v('12 printf("%d", *p);')])]),t._v(" "),n("p",[n("em",[t._v("(gdb) bt -------------")]),t._v(" 显示栈信息")]),t._v(" "),n("p",[n("em",[t._v("#0 0x0000000000400554 in sub () at test6.c:12")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x0000000000400539 in main () at test6.c:5")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[t._v("可以看到最后入栈的是sub函数里、位于test6.c文件第12行。所以core dump的问题可能出在这里。")]),t._v(" "),n("h1",{attrs:{id:"_10-gdb调试"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_10-gdb调试"}},[t._v("#")]),t._v(" 10 gdb调试")]),t._v(" "),n("h2",{attrs:{id:"_10-1-命令介绍"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_10-1-命令介绍"}},[t._v("#")]),t._v(" 10.1 命令介绍")]),t._v(" "),n("p",[t._v("gdb脚本基于gdb命令实现,可在虚拟机和设备上直接运行。使用此脚本可批量对多个进程执行给定命令,也可以调试-i指定的非进程。")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("命令")]),t._v(" "),n("th",[t._v("gdb")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("命令格式")]),t._v(" "),n("td",[t._v("gdb [-s|-p] [-w] [-F 'SEPERATOR'] [-i '_PIDS'] [-e '_PIDS'] -c|-f 'CMD_ARGS'")])]),t._v(" "),n("tr",[n("td",[t._v("参数说明")]),t._v(" "),n("td",[t._v("-s 串行执行CMD(依次对每个执行CMD;默认选项) -p 并行执行CMD(同时对每个执行CMD) -w 等待所有上都执行CMD完毕,否则任意执行完CMD都将停止其他上的执行(仅对-p有效) -i 使用指定的 pids(多个pid以空格分隔),若不指定则自动扫描所有进程 -e 剔除指定的 pids(多个pid以空格分隔) -c 命令列表(多条命令以';'或-F指定的分隔符进行分隔) -f 命令文件(对于带有分支、循环等复杂控制的多条命令,推荐采用命令文件形式) -F 命令列表中的分隔符(默认为';')")])])])]),t._v(" "),n("h2",{attrs:{id:"_10-2-使用示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_10-2-使用示例"}},[t._v("#")]),t._v(" 10.2 使用示例")]),t._v(" "),n("ol",[n("li",[n("p",[t._v("获取mempool状态。(PID应为master或nae的pid)")]),t._v(" "),n("p",[t._v("gdb -c 'call rte_mempool_list_dump(stdout)' -i ")]),t._v(" "),n("p",[t._v("gdb -c 'call cfg_callback_test_coredump(0,0)' -i $pid")]),t._v(" "),n("p",[t._v("gdb -c '' -i $pid")])]),t._v(" "),n("li",[n("p",[t._v("临时在指定位置添加打印函数。")]),t._v(" "),n("p",[t._v("gdb -p -c 'b test.c:45; commands; echo ----will bug_on----\\n; bt; c; end; c'")])]),t._v(" "),n("li",[n("p",[t._v("验证RCU是否执行session释放。")]),t._v(" "),n("p",[t._v("gdb -p -c 'handle all noprint nostop; b _free_mobj if mid==session_mobj; commands; info thread; bt; end; c'")])]),t._v(" "),n("li",[n("p",[t._v("显示所有进程的calltrace信息及本地变量。")]),t._v(" "),n("p",[t._v("说明:对于多、无断点场景下的私有数据、状态,可串行顺序执行。")]),t._v(" "),n("p",[t._v("gdb -c 'bt full'")])]),t._v(" "),n("li",[n("p",[t._v("显示所有进程/线程的calltrace信息。(类似于tdb的info state)")])])]),t._v(" "),n("p",[t._v("说明:对于多、无断点场景下的私有数据、状态,可串行顺序执行。")]),t._v(" "),n("p",[t._v("gdb -c 'thread apply all bt'")]),t._v(" "),n("ol",[n("li",[n("p",[t._v("查看每个进程的私有全局变量engine_id、session_local,并打印CallTrace。")]),t._v(" "),n("p",[t._v("gdb -c 'p engine_id; p/x *session_local; bt'")])]),t._v(" "),n("li",[n("p",[t._v("对指定进程11662,在其neigh.c:1235行的BUG_ON(1)处设置断点,生成core文件。")]),t._v(" "),n("p",[t._v("说明:这种方式生成的core文件不同于由内核生成的/SE/core--PID,它含有共享内存的绝大部分数据,便于深入分析。须注意的是这种core文件一般较大,可能达到几个GB,因此要保证足够的存储空间;存储可能需要十几秒或几十秒。若不指定文件名,则在当前目录下生成名为core.PID的core文件(此时可提前cd到/SE下)。")]),t._v(" "),n("p",[t._v("gdb -c 'b neigh.c:1235; commands; silent; gcore /home/luo/workspace/core-neigh.11662; c; end; c' -i 11662")])]),t._v(" "),n("li",[n("p",[t._v("对指定进程11662,在其ut函数处设置断点,每个报文到来则打印tbuf信息。")])])]),t._v(" "),n("p",[t._v("说明:对单个进程,不存在串行/并行的区别,可按串行处理。")]),t._v(" "),n("p",[t._v("gdb -c 'b ut; commands; silent; p/x *tbuf; c; end; c' -i 11662")]),t._v(" "),n("ol",[n("li",[t._v("打开分片重组部分的调试开关debug_ip4_frag_recv、debug_ip4_mtu_send。")])]),t._v(" "),n("p",[t._v("说明:这两个变量都为共享数据,只需设置单个即可,如pid为11662。")]),t._v(" "),n("p",[t._v("gdb -c 'set debug_ip4_frag_recv=1; set debug_ip4_mtu_send=1; printf \"recv=%d,send=%d\",debug_ip4_frag_recv,debug_ip4_mtu_send' -i 11662")]),t._v(" "),n("ol",[n("li",[t._v("对所有进程设置条件指令断点,触发后执行指定命令,执行命令后继续执行不退出。")])]),t._v(" "),n("p",[t._v("说明:对于涉及多的有断点场景,应使用并行模式。")]),t._v(" "),n("p",[t._v("gdb -p -c 'b test.c:22 if cnt%6==4; commands; silent; echo --trace--\\n; bt; printf \"\\nname=%s cnt=%d\\n\", name, cnt; c; end; c'")]),t._v(" "),n("p",[t._v("该命令序列也可写入命令文件:(-f /tmp/a.gdb)")]),t._v(" "),n("p",[t._v("handle all noprint nostop")]),t._v(" "),n("p",[t._v("b test.c:22 if cnt%6==4")]),t._v(" "),n("p",[t._v("commands")]),t._v(" "),n("p",[t._v("silent")]),t._v(" "),n("p",[t._v("echo --trace--\\n")]),t._v(" "),n("p",[t._v("bt")]),t._v(" "),n("p",[t._v('printf "\\nname=%s cnt=%d\\n", name, cnt')]),t._v(" "),n("p",[t._v("c")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("p",[t._v("c")]),t._v(" "),n("p",[t._v("[注]:最后的c命令,使得设完断点及commands后继续运行,倒数第二条c命令,使得断点触发/处理后仍继续运行。")]),t._v(" "),n("ol",[n("li",[n("p",[t._v("对所有进程设置数据断点,当数值被改变时,打印CallTrace。")]),t._v(" "),n("p",[t._v("说明:watch可监控数据是否被改变,rwatch可监控数据是否被读取,awatch包括这两类。")]),t._v(" "),n("p",[t._v("gdb -p -c 'watch st.age; commands; bt; end; c; c'")])]),t._v(" "),n("li",[n("p",[t._v("对每个设置多个断点,每个断点触发时打印CallTrace及文件/函数/行信息。")]),t._v(" "),n("p",[t._v("说明:每个断点对应自己的触发处理,此处采用了自定义命令hit_me的方式。")]),t._v(" "),n("p",[t._v("gdb -p -f /tmp/b.gdb")]),t._v(" "),n("p",[t._v("handle all noprint nostop")]),t._v(" "),n("p",[t._v("define hit_me")]),t._v(" "),n("p",[t._v("echo \\n>>>hit_me>>>\\n")]),t._v(" "),n("p",[t._v("bt")]),t._v(" "),n("p",[t._v("info thread")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("p",[t._v("b test.c:24")]),t._v(" "),n("p",[t._v("commands")]),t._v(" "),n("p",[t._v("hit_me")]),t._v(" "),n("p",[t._v("c")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("p",[t._v("b test.c:36")]),t._v(" "),n("p",[t._v("commands")]),t._v(" "),n("p",[t._v("hit_me")]),t._v(" "),n("p",[t._v("c")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("p",[t._v("c")])]),t._v(" "),n("li",[n("p",[t._v("查看phy_dev[]中ifindex为26的结构体。")]),t._v(" "),n("p",[t._v("说明:phy_dev为共享数据,因此只需查看单个即可,如pid为11662。命令序列略繁,可写入命令文件。")]),t._v(" "),n("p",[t._v("gdb -f /tmp/dev.gdb -i 11662")]),t._v(" "),n("p",[t._v("脚本/tmp/dev.gdb内容如下:")]),t._v(" "),n("p",[t._v("handle all noprint nostop")]),t._v(" "),n("p",[t._v("set print pretty")]),t._v(" "),n("p",[t._v("set $idx=26")]),t._v(" "),n("p",[t._v("set $i=0")]),t._v(" "),n("p",[t._v("while ($i<256)")]),t._v(" "),n("p",[t._v("set $d = (struct dev*)phy_dev[$i]")]),t._v(" "),n("p",[t._v("if ($d == 0)")]),t._v(" "),n("p",[t._v("loop_break")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("p",[t._v("if ($d->ifindex==$idx)")]),t._v(" "),n("p",[t._v("p/x *$d")]),t._v(" "),n("p",[t._v("loop_break")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("p",[t._v("set $i = $i+1")]),t._v(" "),n("p",[t._v("end")])]),t._v(" "),n("li",[n("p",[t._v("查看挂接在链表mirror_filter_list上的每个filter节点。")])])]),t._v(" "),n("p",[t._v("说明:mirror_filter_list为共享数据,因此只需查看单个即可,如pid为11662。")]),t._v(" "),n("p",[t._v("gdb -f /tmp/mirror_filter.gdb -i 11662")]),t._v(" "),n("p",[t._v("脚本mirror_filter.gdb内容如下:")]),t._v(" "),n("p",[t._v("handle all noprint nostop")]),t._v(" "),n("p",[t._v("set print pretty")]),t._v(" "),n("p",[t._v("p/x &mirror_filter_list")]),t._v(" "),n("p",[t._v("set $f=mirror_filter_list.next")]),t._v(" "),n("p",[t._v("while (1)")]),t._v(" "),n("p",[t._v("if ($f==&mirror_filter_list)")]),t._v(" "),n("p",[t._v("echo [end of list]")]),t._v(" "),n("p",[t._v("loop_break")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("p",[t._v("p/x *(struct mirror_filter_t*)$f")]),t._v(" "),n("p",[t._v("set $f=((struct list_head*)$f)->next")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("ol",[n("li",[n("p",[t._v("获取进程core大小限制。")]),t._v(" "),n("p",[t._v("gdb -c 'p getrlimit(4,$rsp-32); x/2xg $rsp-32'")])])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/14.21bcebc4.js b/assets/js/14.21bcebc4.js
new file mode 100644
index 0000000..fc97f38
--- /dev/null
+++ b/assets/js/14.21bcebc4.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{596:function(s,t,a){"use strict";a.r(t);var n=a(15),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"mutex、读写锁、自旋锁、信号量以及rcu的性能测试"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mutex、读写锁、自旋锁、信号量以及rcu的性能测试"}},[s._v("#")]),s._v(" mutex、读写锁、自旋锁、信号量以及RCU的性能测试")]),s._v(" "),a("h2",{attrs:{id:"前言"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前言"}},[s._v("#")]),s._v(" 前言")]),s._v(" "),a("blockquote",[a("p",[s._v("本例为一个读线程和一个写线程,在不同加锁情况下测试一秒钟读写次数\n没有测试多线程情况,结果只有参考意义\n读写次数还与cpu频率相关 但大致不同种类的锁性能比较差距不大\n测试源码和过程在最下面")])]),s._v(" "),a("h2",{attrs:{id:"一、直接上结论"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#一、直接上结论"}},[s._v("#")]),s._v(" 一、直接上结论")]),s._v(" "),a("h3",{attrs:{id:"_1、以下为每秒读写次数"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_1、以下为每秒读写次数"}},[s._v("#")]),s._v(" 1、以下为每秒读写次数")]),s._v(" "),a("blockquote",[a("p",[s._v("次数与cpu频率相关,不同机器测试结果不同(这里使用ubuntu20.04虚拟机测试的)")])]),s._v(" "),a("p",[s._v("读写锁\t21000k")]),s._v(" "),a("p",[s._v("mutex\t31000k")]),s._v(" "),a("p",[s._v("自旋锁\t58000k")]),s._v(" "),a("p",[s._v("信号量 27000k")]),s._v(" "),a("p",[s._v("rcu\t\t47000k")]),s._v(" "),a("h3",{attrs:{id:"_2、锁的特点和使用场景"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2、锁的特点和使用场景"}},[s._v("#")]),s._v(" 2、锁的特点和使用场景")]),s._v(" "),a("p",[s._v("自旋锁特点 循环等待等 力度很小 用于链表头指针改变等情况")]),s._v(" "),a("p",[s._v("mutex 加锁时线程休眠一会看一下 可用于大部分情况")]),s._v(" "),a("p",[s._v("读写锁 读写都要判断 加锁复杂 不推荐使用")]),s._v(" "),a("p",[s._v("信号量 pv操作 比mutex低一点")]),s._v(" "),a("p",[s._v("rcu 读写锁变种 read copy update 可以代替读写锁情况")]),s._v(" "),a("h2",{attrs:{id:"二、环境准备"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#二、环境准备"}},[s._v("#")]),s._v(" 二、环境准备")]),s._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[s._v("编译命令\n")])])]),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v(" gcc -o rcu rcu.c -lpthread -lurcu\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[s._v("rcu锁需要安装liburcu-dev\n")])])]),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("apt-get")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" liburcu-dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("h2",{attrs:{id:"三、实际测试结果"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#三、实际测试结果"}},[s._v("#")]),s._v(" 三、实际测试结果")]),s._v(" "),a("p",[s._v("不加锁")]),s._v(" "),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v("root@luo:~/workspace/test"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ./rcu ")]),s._v("\nError: x:2340421, y:3524383\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("读写锁")]),s._v(" "),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v("root@luo:~/workspace/test"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ./rcu ")]),s._v("\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("19500709")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("19500")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("44758029")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("22379")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("65393430")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("21797")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("85189522")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("21297")]),s._v(" K reads/sec\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br")])]),a("p",[s._v("信号量")]),s._v(" "),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v("root@luo:~/workspace/test"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ./rcu ")]),s._v("\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("27627678")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("27627")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("55094966")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("27547")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("82395410")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("27465")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("109609817")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("27402")]),s._v(" K reads/sec\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("p",[s._v("mutex")]),s._v(" "),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v("root@luo:~/workspace/test"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ./rcu ")]),s._v("\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("32018261")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("32018")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("63767452")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("31883")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("95838658")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("31946")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("127792109")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("31948")]),s._v(" K reads/sec\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br")])]),a("p",[s._v("自旋锁")]),s._v(" "),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v("root@luo:~/workspace/test"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ./rcu ")]),s._v("\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("57844075")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("57844")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("117047083")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("58523")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("173215973")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("57738")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("229239811")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("57309")]),s._v(" K reads/sec\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br")])]),a("p",[s._v("RCU")]),s._v(" "),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v("root@luo:~/workspace/test"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ./rcu ")]),s._v("\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("47511136")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("47511")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("94736084")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("47368")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("141648406")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("47216")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("188779939")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("47194")]),s._v(" K reads/sec\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br")])]),a("h2",{attrs:{id:"四、-源码"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#四、-源码"}},[s._v("#")]),s._v(" 四、 源码")]),s._v(" "),a("p",[s._v("rcu.c")]),s._v(" "),a("div",{staticClass:"language-c line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-c"}},[a("code",[a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("point")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("point")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("gp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" done "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("long")]),s._v(" reads "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("pthread_rwlock_t")]),s._v(" rwlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("pthread_mutex_t")]),s._v(" mutex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("pthread_spinlock_t")]),s._v(" spinlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sem_t")]),s._v(" sem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("timer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("timespec")]),s._v(" ts"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ts2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("timespec_get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("ts"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" TIME_UTC"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v("done"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sleep")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("timespec_get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("ts2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" TIME_UTC"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("time_t")]),s._v(" sec "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" ts2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tv_sec "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" ts"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tv_sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"reads: %ld, %ld K reads/sec\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reads"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reads"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("updater")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("point")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("point")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("old"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" INT_MAX"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n\t\tp "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("malloc")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("point")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t\tp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t\told "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\t\tgp "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_rwlock_wrlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("rwlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tgp "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_rwlock_unlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("rwlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_mutex_lock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("mutex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tgp "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_mutex_unlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("mutex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_spin_lock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("spinlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tgp "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_spin_unlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("spinlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")])])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rcu_assign_pointer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("synchronize_rcu")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("else")])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sem_wait")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("sem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tgp "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sem_post")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("sem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("endif")])]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("free")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("old"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("reader")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rcu_register_thread")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//urcu")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v("done"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\t\tx "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\ty "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_rwlock_rdlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("rwlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tx "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\ty "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_rwlock_unlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("rwlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_mutex_lock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("mutex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tx "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\ty "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_mutex_unlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("mutex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_spin_lock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("spinlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tx "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\ty "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_spin_unlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("spinlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")])])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rcu_read_lock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("point")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("p "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rcu_dereference")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tx "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\ty "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rcu_read_unlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("else")])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sem_wait")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("sem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tx "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\ty "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sem_post")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("sem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("endif")])]),s._v("\n\t\treads "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("y "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" x"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Error: x:%d, y:%d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t\tdone "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("break")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rcu_unregister_thread")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("exit")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("pthread_t")]),s._v(" tid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_rwlock_init")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("rwlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_mutex_init")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("mutex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_spin_init")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("spinlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" PTHREAD_PROCESS_SHARED"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sem_init")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("sem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rcu_init")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// rcu ")]),s._v("\n\n\tgp "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("malloc")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("point")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\tgp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\tgp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("tid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" updater"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("tid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reader"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("tid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" timer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_join")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("tid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("free")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br"),a("span",{staticClass:"line-number"},[s._v("52")]),a("br"),a("span",{staticClass:"line-number"},[s._v("53")]),a("br"),a("span",{staticClass:"line-number"},[s._v("54")]),a("br"),a("span",{staticClass:"line-number"},[s._v("55")]),a("br"),a("span",{staticClass:"line-number"},[s._v("56")]),a("br"),a("span",{staticClass:"line-number"},[s._v("57")]),a("br"),a("span",{staticClass:"line-number"},[s._v("58")]),a("br"),a("span",{staticClass:"line-number"},[s._v("59")]),a("br"),a("span",{staticClass:"line-number"},[s._v("60")]),a("br"),a("span",{staticClass:"line-number"},[s._v("61")]),a("br"),a("span",{staticClass:"line-number"},[s._v("62")]),a("br"),a("span",{staticClass:"line-number"},[s._v("63")]),a("br"),a("span",{staticClass:"line-number"},[s._v("64")]),a("br"),a("span",{staticClass:"line-number"},[s._v("65")]),a("br"),a("span",{staticClass:"line-number"},[s._v("66")]),a("br"),a("span",{staticClass:"line-number"},[s._v("67")]),a("br"),a("span",{staticClass:"line-number"},[s._v("68")]),a("br"),a("span",{staticClass:"line-number"},[s._v("69")]),a("br"),a("span",{staticClass:"line-number"},[s._v("70")]),a("br"),a("span",{staticClass:"line-number"},[s._v("71")]),a("br"),a("span",{staticClass:"line-number"},[s._v("72")]),a("br"),a("span",{staticClass:"line-number"},[s._v("73")]),a("br"),a("span",{staticClass:"line-number"},[s._v("74")]),a("br"),a("span",{staticClass:"line-number"},[s._v("75")]),a("br"),a("span",{staticClass:"line-number"},[s._v("76")]),a("br"),a("span",{staticClass:"line-number"},[s._v("77")]),a("br"),a("span",{staticClass:"line-number"},[s._v("78")]),a("br"),a("span",{staticClass:"line-number"},[s._v("79")]),a("br"),a("span",{staticClass:"line-number"},[s._v("80")]),a("br"),a("span",{staticClass:"line-number"},[s._v("81")]),a("br"),a("span",{staticClass:"line-number"},[s._v("82")]),a("br"),a("span",{staticClass:"line-number"},[s._v("83")]),a("br"),a("span",{staticClass:"line-number"},[s._v("84")]),a("br"),a("span",{staticClass:"line-number"},[s._v("85")]),a("br"),a("span",{staticClass:"line-number"},[s._v("86")]),a("br"),a("span",{staticClass:"line-number"},[s._v("87")]),a("br"),a("span",{staticClass:"line-number"},[s._v("88")]),a("br"),a("span",{staticClass:"line-number"},[s._v("89")]),a("br"),a("span",{staticClass:"line-number"},[s._v("90")]),a("br"),a("span",{staticClass:"line-number"},[s._v("91")]),a("br"),a("span",{staticClass:"line-number"},[s._v("92")]),a("br"),a("span",{staticClass:"line-number"},[s._v("93")]),a("br"),a("span",{staticClass:"line-number"},[s._v("94")]),a("br"),a("span",{staticClass:"line-number"},[s._v("95")]),a("br"),a("span",{staticClass:"line-number"},[s._v("96")]),a("br"),a("span",{staticClass:"line-number"},[s._v("97")]),a("br"),a("span",{staticClass:"line-number"},[s._v("98")]),a("br"),a("span",{staticClass:"line-number"},[s._v("99")]),a("br"),a("span",{staticClass:"line-number"},[s._v("100")]),a("br"),a("span",{staticClass:"line-number"},[s._v("101")]),a("br"),a("span",{staticClass:"line-number"},[s._v("102")]),a("br"),a("span",{staticClass:"line-number"},[s._v("103")]),a("br"),a("span",{staticClass:"line-number"},[s._v("104")]),a("br"),a("span",{staticClass:"line-number"},[s._v("105")]),a("br"),a("span",{staticClass:"line-number"},[s._v("106")]),a("br"),a("span",{staticClass:"line-number"},[s._v("107")]),a("br"),a("span",{staticClass:"line-number"},[s._v("108")]),a("br"),a("span",{staticClass:"line-number"},[s._v("109")]),a("br"),a("span",{staticClass:"line-number"},[s._v("110")]),a("br"),a("span",{staticClass:"line-number"},[s._v("111")]),a("br"),a("span",{staticClass:"line-number"},[s._v("112")]),a("br"),a("span",{staticClass:"line-number"},[s._v("113")]),a("br"),a("span",{staticClass:"line-number"},[s._v("114")]),a("br"),a("span",{staticClass:"line-number"},[s._v("115")]),a("br"),a("span",{staticClass:"line-number"},[s._v("116")]),a("br"),a("span",{staticClass:"line-number"},[s._v("117")]),a("br"),a("span",{staticClass:"line-number"},[s._v("118")]),a("br"),a("span",{staticClass:"line-number"},[s._v("119")]),a("br"),a("span",{staticClass:"line-number"},[s._v("120")]),a("br"),a("span",{staticClass:"line-number"},[s._v("121")]),a("br"),a("span",{staticClass:"line-number"},[s._v("122")]),a("br"),a("span",{staticClass:"line-number"},[s._v("123")]),a("br"),a("span",{staticClass:"line-number"},[s._v("124")]),a("br"),a("span",{staticClass:"line-number"},[s._v("125")]),a("br"),a("span",{staticClass:"line-number"},[s._v("126")]),a("br"),a("span",{staticClass:"line-number"},[s._v("127")]),a("br"),a("span",{staticClass:"line-number"},[s._v("128")]),a("br"),a("span",{staticClass:"line-number"},[s._v("129")]),a("br"),a("span",{staticClass:"line-number"},[s._v("130")]),a("br"),a("span",{staticClass:"line-number"},[s._v("131")]),a("br"),a("span",{staticClass:"line-number"},[s._v("132")]),a("br"),a("span",{staticClass:"line-number"},[s._v("133")]),a("br"),a("span",{staticClass:"line-number"},[s._v("134")]),a("br"),a("span",{staticClass:"line-number"},[s._v("135")]),a("br"),a("span",{staticClass:"line-number"},[s._v("136")]),a("br"),a("span",{staticClass:"line-number"},[s._v("137")]),a("br"),a("span",{staticClass:"line-number"},[s._v("138")]),a("br"),a("span",{staticClass:"line-number"},[s._v("139")]),a("br"),a("span",{staticClass:"line-number"},[s._v("140")]),a("br"),a("span",{staticClass:"line-number"},[s._v("141")]),a("br"),a("span",{staticClass:"line-number"},[s._v("142")]),a("br"),a("span",{staticClass:"line-number"},[s._v("143")]),a("br"),a("span",{staticClass:"line-number"},[s._v("144")]),a("br"),a("span",{staticClass:"line-number"},[s._v("145")]),a("br"),a("span",{staticClass:"line-number"},[s._v("146")]),a("br"),a("span",{staticClass:"line-number"},[s._v("147")]),a("br"),a("span",{staticClass:"line-number"},[s._v("148")]),a("br"),a("span",{staticClass:"line-number"},[s._v("149")]),a("br"),a("span",{staticClass:"line-number"},[s._v("150")]),a("br"),a("span",{staticClass:"line-number"},[s._v("151")]),a("br"),a("span",{staticClass:"line-number"},[s._v("152")]),a("br"),a("span",{staticClass:"line-number"},[s._v("153")]),a("br"),a("span",{staticClass:"line-number"},[s._v("154")]),a("br"),a("span",{staticClass:"line-number"},[s._v("155")]),a("br"),a("span",{staticClass:"line-number"},[s._v("156")]),a("br"),a("span",{staticClass:"line-number"},[s._v("157")]),a("br"),a("span",{staticClass:"line-number"},[s._v("158")]),a("br"),a("span",{staticClass:"line-number"},[s._v("159")]),a("br"),a("span",{staticClass:"line-number"},[s._v("160")]),a("br"),a("span",{staticClass:"line-number"},[s._v("161")]),a("br"),a("span",{staticClass:"line-number"},[s._v("162")]),a("br"),a("span",{staticClass:"line-number"},[s._v("163")]),a("br"),a("span",{staticClass:"line-number"},[s._v("164")]),a("br"),a("span",{staticClass:"line-number"},[s._v("165")]),a("br"),a("span",{staticClass:"line-number"},[s._v("166")]),a("br"),a("span",{staticClass:"line-number"},[s._v("167")]),a("br"),a("span",{staticClass:"line-number"},[s._v("168")]),a("br"),a("span",{staticClass:"line-number"},[s._v("169")]),a("br"),a("span",{staticClass:"line-number"},[s._v("170")]),a("br"),a("span",{staticClass:"line-number"},[s._v("171")]),a("br"),a("span",{staticClass:"line-number"},[s._v("172")]),a("br"),a("span",{staticClass:"line-number"},[s._v("173")]),a("br"),a("span",{staticClass:"line-number"},[s._v("174")]),a("br"),a("span",{staticClass:"line-number"},[s._v("175")]),a("br"),a("span",{staticClass:"line-number"},[s._v("176")]),a("br"),a("span",{staticClass:"line-number"},[s._v("177")]),a("br"),a("span",{staticClass:"line-number"},[s._v("178")]),a("br"),a("span",{staticClass:"line-number"},[s._v("179")]),a("br"),a("span",{staticClass:"line-number"},[s._v("180")]),a("br"),a("span",{staticClass:"line-number"},[s._v("181")]),a("br"),a("span",{staticClass:"line-number"},[s._v("182")]),a("br"),a("span",{staticClass:"line-number"},[s._v("183")]),a("br"),a("span",{staticClass:"line-number"},[s._v("184")]),a("br"),a("span",{staticClass:"line-number"},[s._v("185")]),a("br"),a("span",{staticClass:"line-number"},[s._v("186")]),a("br"),a("span",{staticClass:"line-number"},[s._v("187")]),a("br")])])])}),[],!1,null,null,null);t.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/15.cc9f2f8e.js b/assets/js/15.cc9f2f8e.js
new file mode 100644
index 0000000..9e963ac
--- /dev/null
+++ b/assets/js/15.cc9f2f8e.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{597:function(s,a,t){"use strict";t.r(a);var n=t(15),e=Object(n.a)({},(function(){var s=this,a=s.$createElement,t=s._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h2",{attrs:{id:"方法"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#方法"}},[s._v("#")]),s._v(" 方法")]),s._v(" "),t("p",[s._v("循环分配10000个类对象 然后查看内存空间源码在最下面")]),s._v(" "),t("p",[s._v("对c++类的虚函数有基本了解")]),s._v(" "),t("h2",{attrs:{id:"编译命令"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#编译命令"}},[s._v("#")]),s._v(" 编译命令")]),s._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("g++ -o memtest memtest.cpp -g -O0\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("h2",{attrs:{id:"直接开始"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#直接开始"}},[s._v("#")]),s._v(" 直接开始")]),s._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("@luo:~/workspace/memtest# gdb memtest <----------------------- 使用gdb 调试memtest\nGNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2\n...\n...\nReading symbols from memtest...\n(gdb) r <------------------------------------------------------开始运行\nStarting program: /root/workspace/memtest/memtest \nterminate called after throwing an instance of 'std::bad_alloc'\n what(): std::bad_alloc\n\nProgram received signal SIGABRT, Aborted.\n__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50\n50\t../sysdeps/unix/sysv/linux/raise.c: No such file or directory.\n(gdb) info proc <---------------------------------------------查看当前进程信息\nprocess 2132 <------------------------------------------------ 当前进程pid\ncmdline = '/root/workspace/memtest/memtest'\ncwd = '/root/workspace/memtest'\nexe = '/root/workspace/memtest/memtest'\n(gdb) shell pmap -x 2132 <------------------------------------ 使用pmap查看内存映射\n2132: /root/workspace/memtest/memtest\nAddress Kbytes RSS Dirty Mode Mapping\n0000555555554000 4 4 4 r---- memtest\n0000555555555000 4 4 4 r-x-- memtest\n0000555555556000 4 4 0 r---- memtest\n0000555555557000 4 4 4 r---- memtest\n0000555555558000 4 4 4 rw--- memtest\n0000555555559000 396 324 324 rw--- [ anon ] <------堆内存地址\n00007ffff7a7d000 16 16 16 rw--- [ anon ]\n00007ffff7a81000 12 12 0 r---- libgcc_s.so.1\n00007ffff7a84000 72 72 0 r-x-- libgcc_s.so.1\n00007ffff7a96000 16 16 0 r---- libgcc_s.so.1\n00007ffff7a9a000 4 4 4 r---- libgcc_s.so.1\n00007ffff7a9b000 4 4 4 rw--- libgcc_s.so.1\n00007ffff7a9c000 52 52 0 r---- libm-2.31.so\n00007ffff7aa9000 668 256 0 r-x-- libm-2.31.so\n00007ffff7b50000 612 0 0 r---- libm-2.31.so\n00007ffff7be9000 4 4 4 r---- libm-2.31.so\n00007ffff7bea000 4 4 4 rw--- libm-2.31.so\n00007ffff7beb000 136 136 0 r---- libc-2.31.so\n00007ffff7c0d000 1504 848 8 r-x-- libc-2.31.so\n00007ffff7d85000 312 172 0 r---- libc-2.31.so\n00007ffff7dd3000 16 16 16 r---- libc-2.31.so\n00007ffff7dd7000 8 8 8 rw--- libc-2.31.so\n00007ffff7dd9000 16 12 12 rw--- [ anon ]\n00007ffff7ddd000 600 600 0 r---- libstdc++.so.6.0.28\n00007ffff7e73000 964 628 4 r-x-- libstdc++.so.6.0.28\n00007ffff7f64000 292 164 0 r---- libstdc++.so.6.0.28\n00007ffff7fad000 4 0 0 ----- libstdc++.so.6.0.28\n00007ffff7fae000 44 44 44 r---- libstdc++.so.6.0.28\n00007ffff7fb9000 12 12 12 rw--- libstdc++.so.6.0.28\n00007ffff7fbc000 20 20 20 rw--- [ anon ]\n00007ffff7fcb000 12 0 0 r---- [ anon ]\n00007ffff7fce000 4 4 4 r-x-- [ anon ]\n00007ffff7fcf000 4 4 0 r---- ld-2.31.so\n00007ffff7fd0000 140 140 24 r-x-- ld-2.31.so\n00007ffff7ff3000 32 32 0 r---- ld-2.31.so\n00007ffff7ffc000 4 4 4 r---- ld-2.31.so\n00007ffff7ffd000 4 4 4 rw--- ld-2.31.so\n00007ffff7ffe000 4 4 4 rw--- [ anon ]\n00007ffffffde000 132 12 12 rw--- [ stack ]\nffffffffff600000 4 0 0 --x-- [ anon ]\n---------------- ------- ------- ------- \ntotal kB 6148 3648 548\n\t\t\t\t\t\t\t\t\t\t\t\t\t计算方法 396*1024/8=50688\n(gdb) x/50688a 0x0000555555559000 <----------------------- 查看堆内存地址数据\n0x555555559000:\t0x0\t0x291\n...\n...\n0x55555556aea0:\t0x0\t0x21\n0x55555556aeb0:\t0x555555557cd0 <_ZTV7MEMTEST+16>\t0xbb114514aa114514\n0x55555556aec0:\t0x0\t0x21\n0x55555556aed0:\t0x555555557cd0 <_ZTV7MEMTEST+16>\t0xbb114514aa114514\n0x55555556aee0:\t0x0\t0x21\n0x55555556aef0:\t0x555555557cd0 <_ZTV7MEMTEST+16>\t0xbb114514aa114514\n0x55555556af00:\t0x0\t0x21\n0x55555556af10:\t0x555555557cd0 <_ZTV7MEMTEST+16>\t0xbb114514aa114514\n...\n\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br"),t("span",{staticClass:"line-number"},[s._v("36")]),t("br"),t("span",{staticClass:"line-number"},[s._v("37")]),t("br"),t("span",{staticClass:"line-number"},[s._v("38")]),t("br"),t("span",{staticClass:"line-number"},[s._v("39")]),t("br"),t("span",{staticClass:"line-number"},[s._v("40")]),t("br"),t("span",{staticClass:"line-number"},[s._v("41")]),t("br"),t("span",{staticClass:"line-number"},[s._v("42")]),t("br"),t("span",{staticClass:"line-number"},[s._v("43")]),t("br"),t("span",{staticClass:"line-number"},[s._v("44")]),t("br"),t("span",{staticClass:"line-number"},[s._v("45")]),t("br"),t("span",{staticClass:"line-number"},[s._v("46")]),t("br"),t("span",{staticClass:"line-number"},[s._v("47")]),t("br"),t("span",{staticClass:"line-number"},[s._v("48")]),t("br"),t("span",{staticClass:"line-number"},[s._v("49")]),t("br"),t("span",{staticClass:"line-number"},[s._v("50")]),t("br"),t("span",{staticClass:"line-number"},[s._v("51")]),t("br"),t("span",{staticClass:"line-number"},[s._v("52")]),t("br"),t("span",{staticClass:"line-number"},[s._v("53")]),t("br"),t("span",{staticClass:"line-number"},[s._v("54")]),t("br"),t("span",{staticClass:"line-number"},[s._v("55")]),t("br"),t("span",{staticClass:"line-number"},[s._v("56")]),t("br"),t("span",{staticClass:"line-number"},[s._v("57")]),t("br"),t("span",{staticClass:"line-number"},[s._v("58")]),t("br"),t("span",{staticClass:"line-number"},[s._v("59")]),t("br"),t("span",{staticClass:"line-number"},[s._v("60")]),t("br"),t("span",{staticClass:"line-number"},[s._v("61")]),t("br"),t("span",{staticClass:"line-number"},[s._v("62")]),t("br"),t("span",{staticClass:"line-number"},[s._v("63")]),t("br"),t("span",{staticClass:"line-number"},[s._v("64")]),t("br"),t("span",{staticClass:"line-number"},[s._v("65")]),t("br"),t("span",{staticClass:"line-number"},[s._v("66")]),t("br"),t("span",{staticClass:"line-number"},[s._v("67")]),t("br"),t("span",{staticClass:"line-number"},[s._v("68")]),t("br"),t("span",{staticClass:"line-number"},[s._v("69")]),t("br"),t("span",{staticClass:"line-number"},[s._v("70")]),t("br"),t("span",{staticClass:"line-number"},[s._v("71")]),t("br"),t("span",{staticClass:"line-number"},[s._v("72")]),t("br"),t("span",{staticClass:"line-number"},[s._v("73")]),t("br"),t("span",{staticClass:"line-number"},[s._v("74")]),t("br"),t("span",{staticClass:"line-number"},[s._v("75")]),t("br"),t("span",{staticClass:"line-number"},[s._v("76")]),t("br"),t("span",{staticClass:"line-number"},[s._v("77")]),t("br"),t("span",{staticClass:"line-number"},[s._v("78")]),t("br")])]),t("p",[s._v("使用 c++filt翻译函数符号名称_ZTV7MEMTEST为MEMTEST虚表指针")]),s._v(" "),t("div",{staticClass:"language-sh line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[s._v("root@luo:~/workspace/memtest"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# c++filt _ZTV7MEMTEST")]),s._v("\nvtable "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" MEMTEST\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[s._v("顺便查看一下虚函数表存的什么,~MEMTEST为虚析构函数地址(c++的多态相关)")]),s._v(" "),t("div",{staticClass:"language-sh line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gdb"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" x/10a 0x555555557cd0\n0x555555557cd0 "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("_ZTV7MEMTEST+1"),t("span",{pre:!0,attrs:{class:"token operator"}},[t("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("6")]),s._v(">")]),s._v(":\t0x555555555330 "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("MEMTEST::~MEMTEST"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\t0x55555555534e "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("MEMTEST::~MEMTEST"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[s._v("在类中没有虚函数时的内存")]),s._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("0x55555556aea0:\t0x0\t0x21\n0x55555556aeb0:\t0xbb114514aa114514\t0x0\n0x55555556aea0:\t0x0\t0x21\n0x55555556aeb0:\t0xbb114514aa114514\t0x0\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("p",[s._v("在类中有虚函数时的内存")]),s._v(" "),t("div",{staticClass:"language-sh line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[s._v("0x55555556aea0:\t0x0\t0x21\n0x55555556aeb0:\t0x555555557cd0 "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("_ZTV7MEMTEST+1"),t("span",{pre:!0,attrs:{class:"token operator"}},[t("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("6")]),s._v(">")]),s._v("\t0xbb114514aa114514\n0x55555556aec0:\t0x0\t0x21\n0x55555556aed0:\t0x555555557cd0 "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("_ZTV7MEMTEST+1"),t("span",{pre:!0,attrs:{class:"token operator"}},[t("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("6")]),s._v(">")]),s._v("\t0xbb114514aa114514\n0x55555556aee0:\t0x0\t0x21\n0x55555556aef0:\t0x555555557cd0 "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("_ZTV7MEMTEST+1"),t("span",{pre:!0,attrs:{class:"token operator"}},[t("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("6")]),s._v(">")]),s._v("\t0xbb114514aa114514\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("h2",{attrs:{id:"源码memtest-cpp"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#源码memtest-cpp"}},[s._v("#")]),s._v(" 源码memtest.cpp")]),s._v(" "),t("div",{staticClass:"language-c line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-c"}},[t("code",[t("span",{pre:!0,attrs:{class:"token macro property"}},[t("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),t("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\nusing namespace std"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\nclass MEMTEST\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\npublic"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 注释掉后就没有 虚表指针 0x555555557cd0 <_ZTV7MEMTEST+16>")]),s._v("\n virtual "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("~")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("MEMTEST")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("f")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("10000")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("i"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//")]),s._v("\n MEMTEST "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("p "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" new MEMTEST"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n p"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0xAA114514")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n p"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("j "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0xBB114514")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n throw std"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("bad_alloc")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("f")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br")])])])}),[],!1,null,null,null);a.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/16.d264cc33.js b/assets/js/16.d264cc33.js
new file mode 100644
index 0000000..49ef1d0
--- /dev/null
+++ b/assets/js/16.d264cc33.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{598:function(s,t,a){"use strict";a.r(t);var n=a(15),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"_1-perf工具和火焰图简介"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_1-perf工具和火焰图简介"}},[s._v("#")]),s._v(" 1 perf工具和火焰图简介")]),s._v(" "),a("p",[s._v("能做什么:")]),s._v(" "),a("blockquote",[a("p",[s._v("可以分析函数执⾏的频繁程度")]),s._v(" "),a("p",[s._v("可以分析哪些函数经常阻塞")]),s._v(" "),a("p",[s._v("可以分析哪些函数频繁分配内存")])]),s._v(" "),a("p",[s._v("Flame Graph 原图路径:https://queue.acm.org/downloads/2016/Gregg4.svg")]),s._v(" "),a("p",[a("img",{attrs:{src:"https://queue.acm.org/downloads/2016/Gregg4.svg",alt:"img"}})]),s._v(" "),a("h1",{attrs:{id:"_2-通过perf收集函数堆栈信息绘制火焰图"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-通过perf收集函数堆栈信息绘制火焰图"}},[s._v("#")]),s._v(" 2 通过perf收集函数堆栈信息绘制火焰图")]),s._v(" "),a("h2",{attrs:{id:"_2-1-安装perf"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-1-安装perf"}},[s._v("#")]),s._v(" 2.1 安装perf")]),s._v(" "),a("blockquote",[a("p",[s._v("perf 命令(performance 的缩写)讲起, 它是 Linux 系统原⽣提供的性能分析⼯具, 会返回 CPU 正在执⾏的函数名以及调⽤栈(stack)")])]),s._v(" "),a("p",[s._v("安装perf")]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v(" apt install linux-tools-common\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("测试perf是否可用 perf.data为产生的文件")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# perf record -F 99 -a -g -- sleep 10")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" perf record: Woken up "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("times")]),s._v(" to "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("write")]),s._v(" data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" perf record: Captured and wrote "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.598")]),s._v(" MB perf.data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3370")]),s._v(" samples"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ls")]),s._v("\nperf.data perf.data.old "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" test.c\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br")])]),a("h2",{attrs:{id:"_2-2-编译并运行测试程序"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-2-编译并运行测试程序"}},[s._v("#")]),s._v(" 2.2 编译并运行测试程序")]),s._v(" "),a("p",[s._v("test.c 源码和接受在最下面")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# gcc -o test test.c -g")]),s._v("\n┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ./test ")]),s._v("\nmain into\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("h2",{attrs:{id:"_2-3-使用perf采集数据"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-3-使用perf采集数据"}},[s._v("#")]),s._v(" 2.3 使用perf采集数据")]),s._v(" "),a("p",[s._v("perf record 表示采集系统事件, 没有使⽤ -e 指定采集事件, 则默认采集 cycles(即 CPU clock 周")]),s._v(" "),a("p",[s._v("期), -F 99 表示每秒 99 次, -p "),a("code",[s._v("pidof test")]),s._v("是进程号, 即对哪个进程进⾏分析, -g 表示记录调⽤栈,")]),s._v(" "),a("p",[s._v("sleep 30 则是持续 30 秒.")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# perf record -F 99 -p `pidof test` -g -- sleep 30 ")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" perf record: Woken up "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("times")]),s._v(" to "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("write")]),s._v(" data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" perf record: Captured and wrote "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.235")]),s._v(" MB perf.data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2962")]),s._v(" samples"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ls")]),s._v("\nperf.data perf.data.old "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" test.c\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br")])]),a("p",[s._v("使用perf report 可以看到堆栈热点函数")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# perf report ")]),s._v("\n\nSamples: 2K of event "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'cpu-clock:pppH'")]),s._v(", Event count "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("approx."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(": "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("29919191620")]),s._v(" \n Children Self Command Shared Object Symbol \n+ "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" libc-2.31.so "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" __libc_start_main\n+ "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("29.71")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" main\n+ "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("35.58")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("35.55")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" func_c\n+ "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("19.85")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("19.85")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" func_b\n+ "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("14.85")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9.55")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" func_a\n+ "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5.30")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5.30")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" func_d\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" __lock_text_start\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" apic_timer_interrupt\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" smp_apic_timer_interrupt\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" irq_exit\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" __softirqentry_text_start\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" run_timer_softirq\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" __run_timers.part.0\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" call_timer_fn\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" rh_timer_func\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" usb_hcd_poll_rh_status\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" uhci_hub_status_data\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br")])]),a("h2",{attrs:{id:"_2-4-下载火焰图脚本"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-4-下载火焰图脚本"}},[s._v("#")]),s._v(" 2.4 下载火焰图脚本")]),s._v(" "),a("p",[s._v("https://github.com/brendangregg/FlameGraph")]),s._v(" "),a("p",[s._v("git clone https://gitee.com/mirrors/FlameGraph.git")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# git clone https://gitee.com/mirrors/FlameGraph.git ")]),s._v("\nCloning into "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'FlameGraph'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\nremote: Enumerating objects: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1147")]),s._v(", done.\nremote: Total "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1147")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("delta "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(", reused "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("delta "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(", pack-reused "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1147")]),s._v("\nReceiving objects: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1147")]),s._v("/1147"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1.87")]),s._v(" MiB "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("806.00")]),s._v(" KiB/s, done.\nResolving deltas: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("674")]),s._v("/674"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(", done.\n\n┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ls")]),s._v("\nFlameGraph perf.data perf.data.old "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" test.c\n\n┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ls FlameGraph/")]),s._v("\naix-perf.pl stackcollapse-gdb.pl\ndemos stackcollapse-go.pl\ndev stackcollapse-instruments.pl\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br")])]),a("h2",{attrs:{id:"_2-5-生成火焰图"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-5-生成火焰图"}},[s._v("#")]),s._v(" 2.5 生成火焰图")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > process.svg")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("下载到windows桌面用浏览器打开查看效果")]),s._v(" "),a("p",[s._v("https://lzwtty.oss-cn-hangzhou.aliyuncs.com/blogimage/acknowledge/test_flamegraph.svg")]),s._v(" "),a("p",[a("img",{attrs:{src:"https://lzwtty.oss-cn-hangzhou.aliyuncs.com/blogimage/acknowledge/test_flamegraph.svg",alt:"img"}})]),s._v(" "),a("p",[s._v("可以很清晰的看到热点函数调用占用cpu使用率")]),s._v(" "),a("h2",{attrs:{id:"_2-5-火焰图的含义"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-5-火焰图的含义"}},[s._v("#")]),s._v(" 2.5 ⽕焰图的含义")]),s._v(" "),a("p",[s._v("⽕焰图是基于 stack 信息⽣成的 SVG 图⽚, ⽤来展示 CPU 的调⽤栈。")]),s._v(" "),a("ul",[a("li",[s._v("y 轴表示调⽤栈, 每⼀层都是⼀个函数. 调⽤栈越深, ⽕焰就越⾼, 顶部就是正在执⾏的函数, 下")])]),s._v(" "),a("p",[s._v("⽅都是它的⽗函数.")]),s._v(" "),a("ul",[a("li",[s._v("x 轴表示抽样数, 如果⼀个函数在 x 轴占据的宽度越宽, 就表示它被抽到的次数多, 即执⾏的时")])]),s._v(" "),a("p",[s._v("间⻓. 注意, x 轴不代表时间, ⽽是所有的调⽤栈合并后, 按字⺟顺序排列的.")]),s._v(" "),a("ul",[a("li",[s._v("⽕焰图就是看顶层的哪个函数占据的宽度最⼤. 只要有 “平顶”(plateaus), 就表示该函数可能存")])]),s._v(" "),a("p",[s._v("在性能问题。")]),s._v(" "),a("ul",[a("li",[s._v("颜⾊没有特殊含义, 因为⽕焰图表示的是 CPU 的繁忙程度, 所以⼀般选择暖⾊调.")])]),s._v(" "),a("h2",{attrs:{id:"源码test-c"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#源码test-c"}},[s._v("#")]),s._v(" 源码test.c")]),s._v(" "),a("div",{staticClass:"language-c line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-c"}},[a("code",[a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_d")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 5")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//5")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_a")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 10+5= 15")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//10 ")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_d")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//5 ")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_b")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 20")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_c")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("35")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 35")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"main into\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 100")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("30")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 30 ")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_a")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//10+5 =15")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_b")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_c")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 35")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"main end\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br")])])])}),[],!1,null,null,null);t.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/17.79a30f21.js b/assets/js/17.79a30f21.js
new file mode 100644
index 0000000..36a9e53
--- /dev/null
+++ b/assets/js/17.79a30f21.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{602:function(e,r,t){"use strict";t.r(r);var n=t(15),o=Object(n.a)({},(function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"学习网站"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#学习网站"}},[e._v("#")]),e._v(" 学习网站")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://xiaolincoding.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("小林coding的图解系统"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://programmercarl.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("代码随想录"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.draw.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("好用的在线思维导图"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"博客地址"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#博客地址"}},[e._v("#")]),e._v(" 博客地址")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/g_hongjin/article/details/51649246",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发系统之限流特技"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/wjf1991wjf/article/details/49100893",target:"_blank",rel:"noopener noreferrer"}},[e._v("动态链接库中函数的地址确定---PLT和GOT"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/yangkuanqaz85988/article/details/52403726",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.biaodianfu.com/redis-vs-memcached.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Redis和Memcached的区别"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.nowcoder.com/discuss/26226",target:"_blank",rel:"noopener noreferrer"}},[e._v("epoll内核源码详解+自己总结的流程"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/jcjc918/article/details/50434462",target:"_blank",rel:"noopener noreferrer"}},[e._v("后台开发面试问题整理"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/jansonzhe/article/details/48576025",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux内核:poll机制"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/caoyan_12727/article/details/52346729",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux任务调度机制"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/jansonzhe/article/details/48576025",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux内核:poll机制"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/hzmark/p/raft.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("解读Raft(一 算法基础) - 杭州.Mark - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/alantu2018/p/8461749.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux文件系统详解 - AlanTu - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/initphp/article/details/50833036",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux c 开发 - 内存管理器ptmalloc - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/llzk_/article/details/53813266",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux环境变量及其设置 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/mfryf/p/5390442.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("比较全面的gdb调试命令 - 知识天地 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/shallnet/article/details/47132861",target:"_blank",rel:"noopener noreferrer"}},[e._v("把握linux内核设计思想(六):内核时钟中断 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/skying555/p/5029620.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux进程调度原理 - alex.shu - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/yhf19881015/article/details/7570354",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux系统调用的实现机制分析 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.ruanyifeng.com/blog/2011/12/inode.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("理解inode - 阮一峰的网络日志"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/wm_1991/article/details/52218718",target:"_blank",rel:"noopener noreferrer"}},[e._v("多阶hash表 - juary_的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/maokelong95/article/details/51989081",target:"_blank",rel:"noopener noreferrer"}},[e._v("理解 glibc malloc - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.chinaunix.net/uid-26111972-id-3420130.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Redis与Memcached的比较-zpf1218-ChinaUnix博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/eroswang/article/details/4130972",target:"_blank",rel:"noopener noreferrer"}},[e._v("glibc中malloc的详细解释 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/Survivalist/p/8119891.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Redis的那些最常见面试问题 - 回首笑人间 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/caishenfans/article/details/44779797",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅析基于glibc的malloc - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/wangzahngjun/p/4977425.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("slab机制 - wangLinuxer - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.163.com/dengminwen@126/blog/static/870226720097189486788/",target:"_blank",rel:"noopener noreferrer"}},[e._v("有感于STL的内存管理"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/qq100440110/article/details/50908992",target:"_blank",rel:"noopener noreferrer"}},[e._v("DNS使用的是TCP协议还是UDP协议 - qq100440110的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/zhongbeida_xue/article/details/51280292",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux的任务调度机制 - Nicholas的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/qq_26768741/article/details/54375524",target:"_blank",rel:"noopener noreferrer"}},[e._v("进程—内存描述符(mm_struct) - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/chenqf/p/6386163.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("彻底弄懂HTTP缓存机制及原理 - 木上有水 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/syzcch/article/details/8075830",target:"_blank",rel:"noopener noreferrer"}},[e._v("利用CAS操作(Compare & Set)实现无锁队列 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/LUO77/p/5816326.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("进程间通信的方式——信号、管道、消息队列、共享内存 - 0giant - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/woshinia/article/details/22877007",target:"_blank",rel:"noopener noreferrer"}},[e._v("TCP的数据流——滑动窗口,拥塞窗口,慢启动,Nagle算法,经受时延的确认等 - 千里之外 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/yangbodong/p/4964698.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("TCP协议总结--停止等待协议,连续ARQ协议,滑动窗口协议 - 杨博东的博客 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/fangyukuan/archive/2010/09/18/1829871.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("C/C++ 笔试、面试题目大汇总 - fangyukuan - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/chy19911123/article/details/48894579",target:"_blank",rel:"noopener noreferrer"}},[e._v("C/C++ 内存对齐原则及作用 - chy19911123的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/wmbg/p/6800354.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("mysql数据库面试总结 - bullets - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/ybwang/archive/2010/06/04/1751279.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("[学习笔记]数据库设计三大范式与BCNF,学习笔记 - ybwang1989 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/weinierzui/article/details/71054964",target:"_blank",rel:"noopener noreferrer"}},[e._v("常见面试题整理--数据库篇(每位开发者必备) - weinierzui的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://lib.csdn.net/mobile/article/linux/43599",target:"_blank",rel:"noopener noreferrer"}},[e._v("知识库 - 你身边的技术百科全书 - CSDN"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/bingshanyijiao_fkx/article/details/51821034",target:"_blank",rel:"noopener noreferrer"}},[e._v("进程上下文与线程上下文 - bingshanyijiao_fkx的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.jb51.net/article/102004.htm",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux线程切换和进程切换的方法_Linux_脚本之家"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/al_xin/article/details/38590931",target:"_blank",rel:"noopener noreferrer"}},[e._v("深入理解计算机系统之虚拟存储器 - Al_xin的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.jianshu.com/p/ff26312e67a9",target:"_blank",rel:"noopener noreferrer"}},[e._v("tcp的半连接与完全连接队列 - go4it - 简书"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/wust_zzwh/article/details/52100392",target:"_blank",rel:"noopener noreferrer"}},[e._v("数位dp总结 之 从入门到模板 - 努力 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/beaglebone/p/5727287.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("类中函数的重载、隐藏和覆盖 - beaglebone - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/dwj411024/p/5978821.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("排序算法____基数排序 - Dingwj_blog - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.nowcoder.com/discuss/57978",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试题干货在此_讨论区_牛客网"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/lemon_tree12138/article/details/51695211",target:"_blank",rel:"noopener noreferrer"}},[e._v("排序算法系列:基数排序 - 大鱼 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/LBSer/p/3322630.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("位图索引:原理(BitMap index) - zhanlijun - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/joeblackzqq/archive/2011/04/11/2013010.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("fopen与open的区别 - 清清飞扬 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.jianshu.com/p/a7633d7687c2",target:"_blank",rel:"noopener noreferrer"}},[e._v("《深入理解计算机系统》-虚拟存储器 - gatsby_dhn - 简书"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/zengyiwen/p/5755170.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux内核解析:进程间通信:管道 - 笨拙的菜鸟 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/cmm0401/article/details/77950122",target:"_blank",rel:"noopener noreferrer"}},[e._v("参考别人的面试总结:linux C/C++服务器后台开发面试题总结 - 大孟的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/nancymake/p/6516933.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux C/C++服务器后台开发面试题总结 - Nancy26 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/w1300048671/article/details/72833835",target:"_blank",rel:"noopener noreferrer"}},[e._v("ELF 文件中的section 和 segment - wo_der的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/linyt/article/details/51635768",target:"_blank",rel:"noopener noreferrer"}},[e._v("聊聊Linux动态链接中的PLT和GOT(1)——何谓PLT与GOT - 海枫的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://jzhihui.iteye.com/blog/1447570",target:"_blank",rel:"noopener noreferrer"}},[e._v("ELF文件的加载和动态链接过程 - - ITeye博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/gatieme/article/details/51628257",target:"_blank",rel:"noopener noreferrer"}},[e._v("ELF文件的加载过程(load_elf_binary函数详解)--Linux进程的管理与调度(十三) - AderStep - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux awk命令详解 - ggjucheng - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/cumirror/article/details/5071234",target:"_blank",rel:"noopener noreferrer"}},[e._v("IP分片和TCP分片的区别 - cumirror的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/shenwansangz/article/details/39184789",target:"_blank",rel:"noopener noreferrer"}},[e._v("fork()----父子进程共享 - 程序狗的成长之路 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/liangkaiming/article/details/6267357",target:"_blank",rel:"noopener noreferrer"}},[e._v("Makefile中的wildcard用法 - liangkaiming的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/chgaowei/article/details/6427731",target:"_blank",rel:"noopener noreferrer"}},[e._v("深入理解C++的动态绑定和静态绑定 - 常高伟的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.jobbole.com/83461/",target:"_blank",rel:"noopener noreferrer"}},[e._v("C++模板元编程(C++ template metaprogramming) - 文章 - 伯乐在线"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/shanghairuoxiao/article/details/72876248",target:"_blank",rel:"noopener noreferrer"}},[e._v("C++后台开发校招面试常见问题 - oscarwin - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/hzhzh007/article/details/6532988",target:"_blank",rel:"noopener noreferrer"}},[e._v("互斥锁的实现(转) - hzhzh007的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/wdscq1234/article/details/52463952",target:"_blank",rel:"noopener noreferrer"}},[e._v("TCP-IP详解:糊涂窗口综合症(Silly Window syndrome) - 深邃 精致 内涵 坚持 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/qq_29503203/article/details/54618275",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅析Linux下的task_struct结构体 - qq_29503203的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/crystal_avast/article/details/7678704",target:"_blank",rel:"noopener noreferrer"}},[e._v("C++虚继承的概念 - crystal_avast的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/dqjyong/article/details/8029527",target:"_blank",rel:"noopener noreferrer"}},[e._v("c++ 虚继承与继承的差异 - Kikim的地盘 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/itech/archive/2012/05/15/2502284.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux的inode的理解 - iTech - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/liuhongxiangm/article/details/8716232",target:"_blank",rel:"noopener noreferrer"}},[e._v("IPC通信:Posix消息队列 - liuhongxiangm的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/jiqingwu/p/linux_semaphore_example.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux线程的信号量同步 - JollyWing - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/ljianhui/article/details/10253345",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux进程间通信——使用共享内存 - ljianhui的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/u014403008/article/details/54174109",target:"_blank",rel:"noopener noreferrer"}},[e._v("gdb调试coredump(使用篇) - 叶落无痕,枫过有情…… - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/benkaoya/article/details/17262053",target:"_blank",rel:"noopener noreferrer"}},[e._v("信号中断 与 慢系统调用 - 许振坪的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/funeral/archive/2013/03/06/2945485.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅析CPU中断技术 - Funeral - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux信号(signal) 机制分析 - h13 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/q576709166/article/details/8649911",target:"_blank",rel:"noopener noreferrer"}},[e._v("EPOLLIN , EPOLLOUT , EPOLLPRI, EPOLLERR 和 EPOLLHUP事件 - yingying.liu的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/cxjchen/p/3143633.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("三种工厂模式的分析以及C++实现 - 曾经的你| - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/hackbuteer1/article/details/7740956",target:"_blank",rel:"noopener noreferrer"}},[e._v("STL源码剖析---红黑树原理详解上 - Hackbuteer1的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/sduliulun/article/details/7732906",target:"_blank",rel:"noopener noreferrer"}},[e._v("valgrind 的使用简介 - sduliulun的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.jb51.net/article/123056.htm",target:"_blank",rel:"noopener noreferrer"}},[e._v("_unix linux_脚本之家"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/starlitnext/archive/2013/03/07/2948929.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("GDT(Global Descriptor Table)全局描述符表 - starlitnext - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/hnzziafyz/article/details/52200265",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux程序加载过程 - 赢在拼搏中 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/zlcxbb/p/5841417.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux 用户空间与内核空间——高端内存详解 - 立超的专栏 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/freeelinux/article/details/53782986",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux虚拟地址空间布局以及进程栈和线程栈总结 - wilcohuang's blog - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/houjun/p/4889597.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("堆排算法的分析与总结 - HOU_JUN - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/zhangliangzi/article/details/51336564",target:"_blank",rel:"noopener noreferrer"}},[e._v("HTTP必知必会——常见面试题总结 - Leeon的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/tom555cat/article/details/22888143",target:"_blank",rel:"noopener noreferrer"}},[e._v("pthread_once单例模式 - tom555cat - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/jsh13417/article/details/10934239",target:"_blank",rel:"noopener noreferrer"}},[e._v("pthread_once()使用(某个时间在整个程序中仅执行一次,不确定是那个线程) - 轻飘飞扬 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/thingk/p/4553243.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("23种设计模式对比与总结 - 码农恋码 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/sinat_34093604/article/details/53082000",target:"_blank",rel:"noopener noreferrer"}},[e._v("ORM框架使用优缺点 - public - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/zhanghairong/p/3757656.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("高性能服务开发之定时器 - 行健 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/zxj015/p/6530766.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Https协议详解 - CoderZhuang - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("图解SSL/TLS协议 - 阮一峰的网络日志"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/zery/p/5164795.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("HTTPS 原理解析 - Zery - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/end/archive/2011/05/25/2057129.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux的用户和用户组管理 - 风生水起 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/lshs/p/6038535.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("TCP系列13—重传—3、协议中RTO计算和RTO定时器维护 - lshs - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/xmphoenix/archive/2011/10/23/2221879.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("可执行文件(ELF)格式的理解 - 深海的小鱼儿 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/yasi_xi/article/details/18551745",target:"_blank",rel:"noopener noreferrer"}},[e._v("GCC/G++编译参数含义 - yasi_xi的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/leopard_ray/article/details/1763796",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux内核中cache的实现 - leopard_ray的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/apprentice89/p/3234677.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("epoll源码实现分析[整理] - Apprentice89 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/goodluckwhh/article/details/10026311",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux内核内存管理学习之三(slab分配器) - 浩海拾贝 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/davidsguo008/article/details/73556811",target:"_blank",rel:"noopener noreferrer"}},[e._v("深度理解select、poll和epoll - 傻眼哥的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/c-cloud/p/3224788.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("【经典算法】——KMP,深入讲解next数组的求解 - c_cloud - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/droidphone/article/details/7445825",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux中断(interrupt)子系统之一:中断系统基本原理 - DroidPhone的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/lyy-5518/p/5460994.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("HTTP Session、Cookie机制详解 - 奔跑的001 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/zhaoYuQing-java2015/p/4621384.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("HttpSession详解 - 别再顺其自然 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/cswuyg/p/3653263.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("HTTP的长连接和短连接 - 烛秋 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://m.baidu.com/from=2001a/s?iscookie=1&word=%E8%87%AA%E5%8A%A8%E5%8C%96%E6%9E%84%E5%BB%BA&ts=6510139&t_kt=78&ie=utf-8&fm_kl=17709454cf&rsv_iqid=0503722478&rsv_t=84f8eru9GFuEsiQMa105nzgqWDbdrP3mCZXXZxmf92P66MWQOfEfcNQ18%252B0&sa=ib&rsv_pq=0503722478&rsv_sug4=5170&inputT=2385&ss=100&setTaijiCookie=1",target:"_blank",rel:"noopener noreferrer"}},[e._v("自动化构建 - 百度"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/zengyiwen/p/5755191.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux内核之进程的基本概念(进程,进程组,会话关系) - 笨拙的菜鸟 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/forstudy/archive/2012/04/03/2427683.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux--进程组、会话、守护进程 - Alex_Monkey - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/chuxiuhong/p/6103928.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("银行家算法学习笔记 - 唯心不易 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/YangloveFeng/article/details/7872251",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux session 浅谈 - younghongjian的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/JohnABC/p/4079669.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux-进程、进程组、作业、会话、控制终端详解 - John_ABC - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/qq_16912651/article/details/53509063",target:"_blank",rel:"noopener noreferrer"}},[e._v("关系型数据库到文档型数据库的跨越 - 海天一色是黑色的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/mickole/p/3188321.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux系统编程之进程(八):守护进程详解及创建,daemon()使用 - mickole - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("数据库设计三大范式 - Ruthless - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/remember-forget/p/6140112.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("常见面试题整理--数据库篇 - 铭记遗忘 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/shuaihj/article/details/14163713",target:"_blank",rel:"noopener noreferrer"}},[e._v("谈谈数据库的ACID - 敦格 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/cws1214/article/details/52430554",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于TCP乱序和重传的问题 - cws1214的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.ruanyifeng.com/blog/2016/06/dns.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("DNS 原理入门 - 阮一峰的网络日志"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/metalseed/article/details/8039326",target:"_blank",rel:"noopener noreferrer"}},[e._v("数据结构专题——线段树 - MetalSeed - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/TenosDoIt/p/3453089.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("一步一步理解线段树 - tenos - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/huangye-dream/archive/2013/07/06/3174725.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("mysql 数据表读锁机制详解 - joy696163 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/weixliu/p/3900764.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("单例模式全面学习(C++版) - weixliu - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/cxjchen/p/3148582.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("单例模式及C++实现代码 - 曾经的你| - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/cywosp/article/details/23397179",target:"_blank",rel:"noopener noreferrer"}},[e._v("每天进步一点点——五分钟理解一致性哈希算法(consistent hashing) - Cynric 的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.chinaunix.net/uid-20788636-id-2626119.html?/11207.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("TCP 协议中MSS的理解-frankzfz-ChinaUnix博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/newwy/p/3254029.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("TCP/IP详解学习笔记(15)-- TCP的流量控制和拥塞控制 - newwy - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/losbyday/p/5847041.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("TCP/IP详解--拥塞控制 & 慢启动 快恢复 拥塞避免 - losbyday - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/Scythe666/article/details/47132447",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于C++中公有继承、私有继承、保护继承的讨论 - This is bill的专属博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/zeb_perfect/article/details/52574915",target:"_blank",rel:"noopener noreferrer"}},[e._v("解决Hash碰撞冲突方法总结 - zeb_perfect的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/anonymalias/article/details/9938865",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux进程通信之POSIX共享内存 - anonymalias的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/xiaohuima_dong/article/details/45096739",target:"_blank",rel:"noopener noreferrer"}},[e._v("IPC对象持续性 - xiaohuima_dong的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.itpub.net/7584541/viewspace-851939",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux环境进程间通信(三):消息队列-hnsyspc-ITPUB博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/anonymalias/article/details/9219945",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux进程同步之POSIX信号量 - anonymalias的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/memewry/archive/2012/08/22/2651696.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("进程/线程同步的方式和机制,进程间通信 - Icnblog_Wan - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/dyllove98/archive/2013/06/28/3161371.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux进程同步之记录锁(fcntl) - jlins - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/cherishui/p/4246133.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux 伙伴算法简介 - 浩天之家 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/Anker/p/3271773.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("孤儿进程与僵尸进程[总结] - Anker's Blog - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/xzzzh/p/6596982.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux虚拟地址空间布局以及进程栈和线程栈总结 - Xzzzh - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://watter1985.iteye.com/blog/1614039",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux 内核poll/select/epoll实现剖析 - 在思考的路上 - ITeye博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/clover-toeic/p/3754433.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux虚拟地址空间布局 - clover_toeic - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/hguisu/article/details/8680808",target:"_blank",rel:"noopener noreferrer"}},[e._v("HTTP详解(1)-工作原理 - guisu,程序人生。 逆水行舟,不进则退。 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/zl-graduate/articles/6724446.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("epoll简介及触发模式(accept、read、send) - 留下的只是回忆 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/hanyan225/archive/2011/07/17/2108609.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux内核分析笔记----中断和中断处理程序 - ☆&寒 烟☆ - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/big_bit/article/details/51804391",target:"_blank",rel:"noopener noreferrer"}},[e._v("标准IO与文件IO 的区别 - big_bit的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/zhangskd/article/details/21992933",target:"_blank",rel:"noopener noreferrer"}},[e._v("硬中断和软中断 - zhangskd的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/wenhui_/article/details/6889013",target:"_blank",rel:"noopener noreferrer"}},[e._v("可重入和不可重入 - wenhui_的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/zbtrs/p/6106783.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈数位DP - zbtrs - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("C++ Queues(队列)、Priority Queues(优先队列) - 面对现实,超越自己 - C++博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://flychao88.iteye.com/blog/1977653",target:"_blank",rel:"noopener noreferrer"}},[e._v("缓存淘汰算法--LRU算法 - 小程故事多 - ITeye博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.chinaunix.net/uid-127037-id-2919545.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux内核中内存cache的实现-yfydz-ChinaUnix博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/petershina/article/details/7946615",target:"_blank",rel:"noopener noreferrer"}},[e._v("socket编程中write、read和send、recv之间的区别 - petershina的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/weiyuefei/article/details/52242890",target:"_blank",rel:"noopener noreferrer"}},[e._v("彻底学会使用epoll(六)——关于ET的若干问题总结 - feeman的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/mickole/p/3188321.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux系统编程之进程(八):守护进程详解及创建,daemon()使用 - mickole - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://segmentfault.com/a/1190000003063859",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux IO模式及 select、poll、epoll详解 - 人云思云 - SegmentFault"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/Anker/p/3265058.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("select、poll、epoll之间的区别总结[整理] - Anker's Blog - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/hsd-/p/6139376.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("树状数组彻底入门 - 半根毛线 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/Kelvin_Yan/article/details/42673963",target:"_blank",rel:"noopener noreferrer"}},[e._v("C++的new、delete及其内存管理 - Kelvin_Yan的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/Commence/p/5785912.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("malloc 函数详解 - Commence - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.jianshu.com/p/3985b1f9d9b4",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈数据库查询优化的几种思路 - 六尺帐篷 - 简书"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.linuxidc.com/Linux/2014-03/98013.htm",target:"_blank",rel:"noopener noreferrer"}},[e._v("硬中断与软中断的区别_Linux编程_Linux公社-Linux系统门户网站"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/33debug/p/6993397.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("信号的基本概念、信号的产生以及阻塞信号 - 滴巴戈 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux信号(signal) 机制分析 - h13 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/yusiguyuan/article/details/11908891",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux中断--LINUX中断机制与信号 - 鱼思故渊的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/echoisland/article/details/6403763",target:"_blank",rel:"noopener noreferrer"}},[e._v("进程线程及堆栈关系的总结 - echoisland的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/jelly_9/article/details/53239718",target:"_blank",rel:"noopener noreferrer"}},[e._v("栈帧之深入理解c函数调用过程 - jelly_9的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://transcoder.baiducontent.com/from=2001a/bd_page_type=1/ssid=0/uid=0/pu=usm%403%2Csz%401320_2003%2Cta%40iphone_1_10.3_1_11.6/baiduid=F8EB1922487B57E4B9B568A60C98DEC3/w=0_10_/t=iphone/l=3/tc?ref=www_iphone&lid=13486286999679729314&order=4&fm=alop&h5ad=1&srd=1&dict=32&tj=www_normal_4_0_10_title&url_mf_score=4&vit=osres&m=8&cltj=cloud_title&asres=1&nt=wnor&title=%E7%BB%8F%E5%85%B8%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84B%E6%A0%91%E4%B8%8EB%2B%E6%A0%91-vincently-%E5%8D%9A%E5%AE%A2%E5%9B%AD&w_qd=IlPT2AEptyoA_yi8mgBQ&sec=23916&di=0b59451c68b1bb67&bdenc=1&tch=124.115.52.1089.3.133&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_ytK1DK6mlrte4viZQRAVDb6M8qMF5nkgTCccQoDlnCe0WAj8xJZhOgtfq&eqid=bb28ea92a2e100001000000559b7d367&wd=&clk_info=%7B%22srcid%22%3A%221599%22%2C%22tplname%22%3A%22www_normal%22%2C%22t%22%3A1505219442195%2C%22sig%22%3A%2211132%22%2C%22xpath%22%3A%22div-a-h3%22%7D",target:"_blank",rel:"noopener noreferrer"}},[e._v("【经典数据结构】B树与B+树 - vincently - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://m.baidu.com/from=2001a/bd_page_type=1/ssid=0/uid=0/pu=usm%401%2Csz%401320_2003%2Cta%40iphone_1_10.3_1_11.6/baiduid=F8EB1922487B57E4B9B568A60C98DEC3/w=0_10_/t=iphone/l=3/tc?ref=www_iphone&lid=11507469517477021613&order=2&fm=alop&tj=www_normal_2_0_10_title&vit=osres&m=8&srd=1&cltj=cloud_title&asres=1&nt=wnor&title=Linux%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E5%92%8C%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98%E7%9A%84%E7%90%86%E8%A7%A3_Linux%E6%95%99%E7%A8%8B_Linux%E5%85%AC%E7%A4%BE...&dict=20&w_qd=IlPT2AEptyoA_yitJU7sE7CvJkxUooQnwDAYaBXV9BM7N4Q6YExaxnDfnwe&sec=23771&di=1360f35ab201f829&bdenc=1&tch=124.133.28.761.2.4530456&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_yJR0CumpEm9xP4kHREsRFv7Lmq3ZpPPdj0PtAIFwmGdWWUn7hlDr0IwdzW&eqid=9fb2be8e94da88001000000559afe1b3&wd=&clk_info=%7B%22srcid%22%3A%221599%22%2C%22tplname%22%3A%22www_normal%22%2C%22t%22%3A1504698815807%2C%22sig%22%3A%222215%22%2C%22xpath%22%3A%22div-a-h3%22%7D&sfOpen=1",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux 物理内存和虚拟内存 - 百度"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601204.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("C/C++函数调用过程分析 - as_ - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/whz_zb/article/details/7425152",target:"_blank",rel:"noopener noreferrer"}},[e._v("胜者树与败者树 - whz_zb的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/u012398613/article/details/51787548",target:"_blank",rel:"noopener noreferrer"}},[e._v("Epoll详解及源码分析 - 我有我的天空 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://m.baidu.com/from=2001a/bd_page_type=1/ssid=0/uid=0/pu=usm%403%2Csz%401320_2003%2Cta%40iphone_1_11.0_1_11.6/baiduid=F8EB1922487B57E4B9B568A60C98DEC3/w=10_10_/t=iphone/l=3/tc?ref=www_iphone&lid=11960810750480137704&order=7&fm=alop&tj=www_normal_7_10_10_title&vit=osres&m=8&srd=1&cltj=cloud_title&asres=1&nt=wnor&title=IP%E8%AF%A6%E8%A7%A3%E4%B9%8B%E7%8E%AF%E5%9B%9E%E6%8E%A5%E5%8F%A3-%E5%A4%A9%E4%B8%8B%E6%97%A0%E8%B4%BC-51CTO%E6%8A%80%E6%9C%AF%E5%8D%9A%E5%AE%A2&dict=20&w_qd=IlPT2AEptyoA_ykywg5csBqxE6NSn9G&sec=24112&di=075ab0d1b45165e2&bdenc=1&tch=124.115.331.1365.1.8&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IIQ3OLzlZ0DCbo93-hvvcXgErYSP50niNHoCb9jDNthcJxmGdWWAk7Bp_rbdmpK&eqid=a5fd5601a80ac0001000000359c2913c&wd=&clk_info=%7B%22srcid%22%3A%221599%22%2C%22tplname%22%3A%22www_normal%22%2C%22t%22%3A1505923439059%2C%22sig%22%3A%2250506%22%2C%22xpath%22%3A%22div-a-h3%22%7D&sfOpen=1",target:"_blank",rel:"noopener noreferrer"}},[e._v("环回地址 - 百度"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/dm_vincent/article/details/7714519",target:"_blank",rel:"noopener noreferrer"}},[e._v("拓扑排序的原理及其实现 - dm_vincent的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/ggggiqnypgjg/article/details/6645824",target:"_blank",rel:"noopener noreferrer"}},[e._v("Manacher算法--O(n)回文子串算法 - xuanflyer - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://transcoder.baiducontent.com/from=2001a/bd_page_type=1/ssid=0/uid=0/pu=usm%403%2Csz%401320_2003%2Cta%40iphone_1_10.3_1_11.6/baiduid=F8EB1922487B57E4B9B568A60C98DEC3/w=0_10_/t=iphone/l=3/tc?ref=www_iphone&lid=11323507255059474430&order=5&fm=alhm&h5ad=1&srd=1&dict=32&tj=h5_mobile_5_0_10_title&w_qd=IlPT2AEptyoA_yi8mgBQ&sec=23976&di=dc52c591f2efaf05&bdenc=1&tch=124.417.302.1209.1.403&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_ytK1DK6mlrte4viZQRASDfpKHaMJICb9n00sqcIxn7c_G1e6so4g43&eqid=9d252dda9d60e8001000000559bb2586&wd=&clk_info=%7B%22srcid%22%3A%221599%22%2C%22tplname%22%3A%22h5_mobile%22%2C%22t%22%3A1505437070391%2C%22sig%22%3A%227417%22%2C%22xpath%22%3A%22div-a-h3%22%7D",target:"_blank",rel:"noopener noreferrer"}},[e._v("【转】二叉树、B树、B-树、B+树、B*树 - zhzhang - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/u013575812/article/details/50989966",target:"_blank",rel:"noopener noreferrer"}},[e._v("设计模式 之 单例模式 (C++ 懒汉经典实现 & DCL实现 & 饿汉经典实现) - 柠檬不加糖的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/hackbuteer1/article/details/7460019",target:"_blank",rel:"noopener noreferrer"}},[e._v("C++中的单例模式 - Hackbuteer1的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/lg1259156776/article/details/52732879",target:"_blank",rel:"noopener noreferrer"}},[e._v("【C/C++】对于可重入、线程安全、异步信号安全几个概念的理解 - ZhangPY的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/czzju/archive/2013/02/14/2911190.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("B树、B-树、B+树、B*树详解(转) - 憨熊之家 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/skywang12345/p/3245399.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("红黑树(一)之 原理和算法详细介绍 - 如果天空不死 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://surlymo.iteye.com/blog/2082684",target:"_blank",rel:"noopener noreferrer"}},[e._v("分布式锁的三种实现方式 - - ITeye技术网站"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/zhangbaochong/p/5164994.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("平衡二叉树详解 - zhangbaochong - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/article/details?id=52717078",target:"_blank",rel:"noopener noreferrer"}},[e._v("n个数中任意两个异或最大值"),t("OutboundLink")],1)])])}),[],!1,null,null,null);r.default=o.exports}}]);
\ No newline at end of file
diff --git a/assets/js/18.3b2b186e.js b/assets/js/18.3b2b186e.js
new file mode 100644
index 0000000..b690f0a
--- /dev/null
+++ b/assets/js/18.3b2b186e.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{601:function(v,_,t){"use strict";t.r(_);var p=t(15),a=Object(p.a)({},(function(){var v=this,_=v.$createElement,t=v._self._c||_;return t("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[t("h1",{attrs:{id:"认识阶段"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#认识阶段"}},[v._v("#")]),v._v(" 认识阶段")]),v._v(" "),t("h2",{attrs:{id:"前言"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#前言"}},[v._v("#")]),v._v(" 前言")]),v._v(" "),t("p",[v._v("\t方法:同学同事 朋友介绍 搭讪 社交软件 相亲")]),v._v(" "),t("p",[v._v("\t目的:多认识女生 明确合适的类型 防止死胡同")]),v._v(" "),t("p",[v._v("\t注意:心态崩溃 很容易喜欢一个女生并上心 容易患得患失 这是所有不会追女生的共同点")]),v._v(" "),t("p",[v._v("\t认识人主要三点:资源 展示面 方法 最重要的是资源")]),v._v(" "),t("p",[v._v("\t主流认识途径: 社交软件 搭讪")]),v._v(" "),t("p",[v._v(" * 社交软件是当下认识女生最快的途径")]),v._v(" "),t("p",[v._v("\t* 认识女生不代表不专一 而是要明确自己喜欢的类型")]),v._v(" "),t("h2",{attrs:{id:"社交软件-探探-积木-soul等"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#社交软件-探探-积木-soul等"}},[v._v("#")]),v._v(" 社交软件(探探 积木 soul等)")]),v._v(" "),t("p",[v._v("社交软件的关键:第一张照片(人帅 生活帅) 增加匹配率")]),v._v(" "),t("p",[v._v("如何用社交软件 要注意的细节")]),v._v(" "),t("p",[v._v("\t第一张照片 做好 修一下 背景好 看清脸 后续兴趣爱好宠物 生活场景")]),v._v(" "),t("p",[v._v("\t不要一直滑")]),v._v(" "),t("p",[v._v("\t目的是要到微信 (可以说 我这个软件不常用 加个微信)")]),v._v(" "),t("p",[v._v("\t不要聊太多")]),v._v(" "),t("p",[v._v("\t不给就是没看上 下一个")]),v._v(" "),t("p",[v._v("\t女生标注一上来就要微信的 都是老司机")]),v._v(" "),t("p",[v._v("\t社交软件聊天不用太在意 要在意照片")]),v._v(" "),t("p",[v._v("\t会员可以买")]),v._v(" "),t("p",[v._v("\t不要发太多朋友圈")]),v._v(" "),t("p",[v._v("\t资料认真填写")]),v._v(" "),t("p",[v._v("\t照片可以约拍")]),v._v(" "),t("p",[v._v("\t可以看其他竞争对手的照片")]),v._v(" "),t("h2",{attrs:{id:"如何搭讪"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#如何搭讪"}},[v._v("#")]),v._v(" 如何搭讪")]),v._v(" "),t("p",[v._v("也是一种提升和别人交流交往方式")]),v._v(" "),t("p",[v._v("主要是 状态 肢体语言 穿搭")]),v._v(" "),t("p",[v._v("搭讪的话术:")]),v._v(" "),t("p",[v._v("\t“我在这附近逛街看到你了 我想和你认识一下 留个微信吧”")]),v._v(" "),t("p",[v._v("\t\t直接给")]),v._v(" "),t("p",[v._v("\t\t犹豫害羞可以坚持一下:“我没有什么其他意思 就是想认识一下 你扫我一下”")]),v._v(" "),t("p",[v._v("\t\t不想给:不强求")]),v._v(" "),t("p",[v._v("容易犯的错误:")]),v._v(" "),t("p",[v._v("\t搭讪前不要被看到 从身后绕")]),v._v(" "),t("p",[v._v("\t拍一下女生肩膀 同时说你好 要适中")]),v._v(" "),t("p",[v._v("\t保持一米")]),v._v(" "),t("p",[v._v("\t等对方看到你的眼睛后再开始说话")]),v._v(" "),t("p",[v._v("\t说话要慢慢说")]),v._v(" "),t("p",[v._v("\t不要有小动作")]),v._v(" "),t("p",[v._v("\t真诚 不要油嘴滑舌")]),v._v(" "),t("p",[v._v("\t有闺蜜的也要打招呼")]),v._v(" "),t("p",[v._v("三步:")]),v._v(" "),t("p",[v._v("\t克服紧张 不在意女生是谁 只要不停的搭讪 不在意结果")]),v._v(" "),t("p",[v._v("\t练习自己的说话和肢体语言")]),v._v(" "),t("p",[v._v("\t尽量多的说话 能说多久说多久")])])}),[],!1,null,null,null);_.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/19.876eee7d.js b/assets/js/19.876eee7d.js
new file mode 100644
index 0000000..363048d
--- /dev/null
+++ b/assets/js/19.876eee7d.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{599:function(t,v,_){"use strict";_.r(v);var p=_(15),a=Object(p.a)({},(function(){var t=this,v=t.$createElement,_=t._self._c||v;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h1",{attrs:{id:"熟悉阶段"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#熟悉阶段"}},[t._v("#")]),t._v(" 熟悉阶段")]),t._v(" "),_("h2",{attrs:{id:"前言"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#前言"}},[t._v("#")]),t._v(" 前言")]),t._v(" "),_("p",[t._v("\t目的:让别人感觉你踏实 知道你是干什么的 大概是一个什么样的人")]),t._v(" "),_("p",[t._v("\t注意:不熟悉属于无效聊天 可以适当幽默 不要想升高提升关系")]),t._v(" "),_("p",[t._v("\t方法:真诚和踏实")]),t._v(" "),_("p",[t._v("要有目的的聊天 有目的的熟悉可以在十几分钟 不能无效聊天 女生放下手机 还能想起是什么人 建立基本的安全感 是个正常人 对我们有了关注 会看朋友圈")]),t._v(" "),_("p",[t._v("熟悉的三要素:")]),t._v(" "),_("p",[t._v("\t让女生感觉到你说一个什么人(IT 宅男 文艺 工科男 工科男 创业者)印象 把感觉给到女生 大概是什么人")]),t._v(" "),_("p",[t._v("(我们班有个同学 特别调皮 成绩也还不错 这学期和别人打了三次架 是老师办公室的常客)")]),t._v(" "),_("p",[t._v("\t大概了解她是什么人 做什么工作 多大年纪 有什么学历 了解基本信息 深入聊天")]),t._v(" "),_("p",[t._v("\t聊聊女生感兴趣的话题 好吃好玩 明星综艺八卦")]),t._v(" "),_("p",[t._v("安全感的基础")]),t._v(" "),_("p",[t._v("\t让别人感觉你踏实 知道你是干什么的 大概是一个什么样的人")]),t._v(" "),_("h2",{attrs:{id:"第一次聊天的步骤-踏实-稳重"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#第一次聊天的步骤-踏实-稳重"}},[t._v("#")]),t._v(" 第一次聊天的步骤 踏实 稳重")]),t._v(" "),_("p",[t._v("\t寒暄 吃了吗 衣服好看 (刚下飞机 累死了 躺床上 抽根烟 休息一下)")]),t._v(" "),_("p",[t._v("\t\t拉好聊氛围 老朋友 熟悉的气氛 搞笑的表情包 幽默开场白 一两句就行")]),t._v(" "),_("p",[t._v("\t\t\t你好 正经正经 幽默对幽默")]),t._v(" "),_("p",[t._v("\t\t\t朋友圈找信息 生活故事 表示自己状态 阳台吹风")]),t._v(" "),_("p",[t._v("")]),t._v(" "),_("p",[t._v("\tdhv 高价值 有价值的地方 留下印象")]),t._v(" "),_("p",[t._v("\t\t快速的自我介绍")]),t._v(" "),_("p",[t._v("\t\t(我是有个心理咨询师 别人情感 的 曾经有一个学员 找我心理辅导 停不下来了怎么这么的)")]),t._v(" "),_("p",[t._v("\t\t(我是有个程序员 出差半年的程序员)")]),t._v(" "),_("p",[t._v("\t\t有趣的事情")]),t._v(" "),_("p",[t._v("\t\tdhv 不要说消极描述工作两点一线 说工程师 喜欢爱好 稍微包装")]),t._v(" "),_("p",[t._v("\t信息互换")]),t._v(" "),_("p",[t._v("\t\t不能问太多 最多三个")]),t._v(" "),_("p",[t._v("\t\t问核心问题 先说自己 再问别人")]),t._v(" "),_("p",[t._v("\t\t职业 年龄 学历 城市地域 了解大致是什么人")]),t._v(" "),_("p",[t._v("\t\t说话要圆润一点 (你多大啊 我感觉 我比你大 ) 前面可以不问名字")]),t._v(" "),_("p",[t._v("\t女生感兴趣的话题")]),t._v(" "),_("p",[t._v("\t\t男生和女生基本没有共同话题的")]),t._v(" "),_("p",[t._v("\t\t聊女生感兴趣的话题 朋友圈 星座八卦 吃的 玩的 宠物明星")]),t._v(" "),_("p",[t._v("\t\t要有情绪的互动 找到感兴趣的点 或者共通的话题")]),t._v(" "),_("p",[t._v("\t\t(看到小孩 可以夸可爱 问为什么乖 激发分享欲)")]),t._v(" "),_("p",[t._v("\t\t聊热点信息")])])}),[],!1,null,null,null);v.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/20.9e432406.js b/assets/js/20.9e432406.js
new file mode 100644
index 0000000..fb679bd
--- /dev/null
+++ b/assets/js/20.9e432406.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{600:function(v,_,t){"use strict";t.r(_);var p=t(15),a=Object(p.a)({},(function(){var v=this,_=v.$createElement,t=v._self._c||_;return t("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[t("h1",{attrs:{id:"吸引阶段"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#吸引阶段"}},[v._v("#")]),v._v(" 吸引阶段")]),v._v(" "),t("p",[v._v("\t吸引:吸引是女生愿意和你接触的原神动力 能配得上对方")]),v._v(" "),t("p",[v._v("\t\t外形 价值 情绪三个吸引")]),v._v(" "),t("p",[v._v("\t目的:让对方知道你是个猎人 优秀有能力的人 (事业成功 社交圈广 朋友多 物质条件优秀 自身条件好 生活有品位情调)")]),v._v(" "),t("p",[v._v("\t注意:无吸引无追求 靠吸引而不是靠追")]),v._v(" "),t("p",[v._v("\t方法:吸引就是高价值展示 做两种感觉被撩与害羞")]),v._v(" "),t("h2",{attrs:{id:"猎人-有能力的男人-有高价值的男人"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#猎人-有能力的男人-有高价值的男人"}},[v._v("#")]),v._v(" 猎人 有能力的男人 有高价值的男人")]),v._v(" "),t("p",[v._v("\t繁衍价值")]),v._v(" "),t("p",[v._v("\t\t高帅 身体强壮健康 年轻女生更喜欢高帅 大一点的喜欢有能力的")]),v._v(" "),t("p",[v._v("\t生存价值")]),v._v(" "),t("p",[v._v("\t\t外在 车房钱")]),v._v(" "),t("p",[v._v("\t\t内在 优秀男人的特质 拼搏 进取 乐观 不屈不挠 有智慧 有内涵 有知识")]),v._v(" "),t("p",[v._v("怎么做")]),v._v(" "),t("p",[v._v("\t高价值展示 朋友圈 工作生活兴趣爱好 展现自己的价值")]),v._v(" "),t("p",[v._v("\t见面的形象 语言")]),v._v(" "),t("p",[v._v("建立吸引后下一步")]),v._v(" "),t("p",[v._v("\t确认建立吸引 服从性测试 要电话 要照片 打电话起床")]),v._v(" "),t("p",[v._v("无吸引无追求")]),v._v(" "),t("p",[v._v("\t没有建立起吸引的时候 暴露需求感会减低女人的吸引")]),v._v(" "),t("p",[v._v("\t不要追求的事")]),v._v(" "),t("h2",{attrs:{id:"吸引的两种感觉-什么是两种感觉-tf-暧昧聊天"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#吸引的两种感觉-什么是两种感觉-tf-暧昧聊天"}},[v._v("#")]),v._v(" 吸引的两种感觉 什么是两种感觉 TF 暧昧聊天")]),v._v(" "),t("p",[v._v("\t被撩的感觉BL 害羞的感觉FS")]),v._v(" "),t("p",[v._v("\t撩BL 有好感才做 反馈一般的一点点 反馈不好的不要撩")]),v._v(" "),t("p",[v._v("\t害羞FS 只能对反馈好的女生做")]),v._v(" "),t("p",[v._v("\t做到想象 情景 有代入感 (和我谈恋爱的感觉一定很幸福吧)")]),v._v(" "),t("h2",{attrs:{id:"吸引的形象-想象就是繁育价值"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#吸引的形象-想象就是繁育价值"}},[v._v("#")]),v._v(" 吸引的形象 想象就是繁育价值")]),v._v(" "),t("p",[v._v("\t第一印象很重要 类似投简历时的学历 形象判断人")]),v._v(" "),t("p",[v._v("\t形象判断一个人的价值")]),v._v(" "),t("p",[v._v("\t发型 穿着 肢体语言")]),v._v(" "),t("p",[v._v("\t大众点评大店 根据脸型做一个发型 拍个照片照样子剪")]),v._v(" "),t("p",[v._v("\t\t定型喷雾 发蜡 发胶 约会准备")]),v._v(" "),t("p",[v._v("\t\t护肤 洁面 水乳")]),v._v(" "),t("p",[v._v("\t服装 小红书")]),v._v(" "),t("p",[v._v("\t模仿偶像 胡歌 和自身身份相符的")]),v._v(" "),t("h2",{attrs:{id:"吸引的展示面"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#吸引的展示面"}},[v._v("#")]),v._v(" 吸引的展示面")]),v._v(" "),t("p",[v._v("\t昵称 头像 前面 墙 朋友圈")]),v._v(" "),t("p",[v._v("\t昵称 不要非主流")]),v._v(" "),t("p",[v._v("\t头像不要 风景照 证件照 宠物 卡通 网图 画质差照片")]),v._v(" "),t("p",[v._v("\t\t任务缩小 视觉中心不要人物而是环境 网红背景 不要全脸要神秘")]),v._v(" "),t("p",[v._v("\t朋友圈封面 广告位")]),v._v(" "),t("p",[v._v("\t\t不要 网图 大头自拍 不要旅游照 风景照 要展示价值 品质生活照")]),v._v(" "),t("p",[v._v("\t签名 有内涵")]),v._v(" "),t("p",[v._v("\t朋友圈 不要转发鸡汤 没有自己的生活 纯文字 优秀的朋友 环境")]),v._v(" "),t("p",[v._v("\t\t不要工作广告分组转发 专业的东西")]),v._v(" "),t("p",[v._v("\t\t美食 娱乐生活 上进 愿意投资自己的人 宠物和小朋友也是好的")]),v._v(" "),t("p",[v._v("\t\t和很多别的女性朋友照片 努力工作")]),v._v(" "),t("p",[v._v("\t\t朋友圈配文 要少")]),v._v(" "),t("p",[v._v("\t\t音乐分享")]),v._v(" "),t("p",[v._v("\t门面 社交软件第一印象")]),v._v(" "),t("p",[v._v("\t展示面是自己的窗口 名片 不是日记本")]),v._v(" "),t("p",[v._v("\t\t社交软件 展示出来的状态")]),v._v(" "),t("p",[v._v("\t展示面差女生一开始就不想聊了")]),v._v(" "),t("p",[v._v("\t展示面是吸引的关键")]),v._v(" "),t("p",[v._v("\t\t看朋友圈的几秒抓住女生")]),v._v(" "),t("p",[v._v("\t做好头像和背景墙")]),v._v(" "),t("p",[v._v("\t\t头像 不要用明星宠物")]),v._v(" "),t("p",[v._v("\t\t要用自己的真是照片 露出正脸 发型 表情 独照 半身照 背景简洁")]),v._v(" "),t("p",[v._v("\t\t背景图 全身照 环境不错的地方")]),v._v(" "),t("p",[v._v("\t多角度展示自己的高价值")]),v._v(" "),t("p",[v._v("\t\t看到自己的价值 要有自己的生活 接触有意思的东西")]),v._v(" "),t("p",[v._v("\t\t展示面照片 工作 兴趣 生活 一定要展现自己的正能量 对生活的热爱")]),v._v(" "),t("p",[v._v("\t\t看小红书这么拍生活照")]),v._v(" "),t("p",[v._v("\t\t精致的生活 高价值的圈子 不要过多散发多愁善感")]),v._v(" "),t("p",[v._v("\t不要发负能量的东西")])])}),[],!1,null,null,null);_.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/21.b160f907.js b/assets/js/21.b160f907.js
new file mode 100644
index 0000000..a58bf37
--- /dev/null
+++ b/assets/js/21.b160f907.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{604:function(t,v,_){"use strict";_.r(v);var a=_(15),r=Object(a.a)({},(function(){var t=this,v=t.$createElement,_=t._self._c||v;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h1",{attrs:{id:"约会"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#约会"}},[t._v("#")]),t._v(" 约会")]),t._v(" "),_("p",[t._v("\t关键的约会牵手S1 亲吻S2")]),t._v(" "),_("h2",{attrs:{id:"注意流程和场地选择"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#注意流程和场地选择"}},[t._v("#")]),t._v(" 注意流程和场地选择")]),t._v(" "),_("p",[t._v("\t约会中的好感:场地40% 见面前的反馈30% 约会中的30% (失败的外部应数是很大的)")]),t._v(" "),_("h2",{attrs:{id:"阶段"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#阶段"}},[t._v("#")]),t._v(" 阶段")]),t._v(" "),_("p",[t._v("\t第一次约会去互动性强的地方好玩的地方 场地逼格要高 环境好")]),t._v(" "),_("p",[t._v("\tS1 好玩的地方文艺的环境好")]),t._v(" "),_("p",[t._v("\tS2 文艺的环境好 半私密空间")]),t._v(" "),_("h2",{attrs:{id:"转场很重要-一定要转场-最好三次-充实"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#转场很重要-一定要转场-最好三次-充实"}},[t._v("#")]),t._v(" 转场很重要 一定要转场 最好三次 充实")]),t._v(" "),_("p",[t._v("\t第一次 奶茶店 餐厅聊天半小时 吃饭")]),t._v(" "),_("p",[t._v("\t第二次 娃娃机 电玩 旋转木马 互动的地方")]),t._v(" "),_("p",[t._v("\t第三次 电影院 聊天")]),t._v(" "),_("h2",{attrs:{id:"约会需要提前了解"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#约会需要提前了解"}},[t._v("#")]),t._v(" 约会需要提前了解")]),t._v(" "),_("p",[t._v("\t约会的场所 目的")]),t._v(" "),_("p",[t._v("\t哪里的东西便宜好吃 环境好")]),t._v(" "),_("p",[t._v("\t哪里适合牵手逛街")]),t._v(" "),_("p",[t._v("\t哪家私人影院")]),t._v(" "),_("p",[t._v("\t哪心情不好适合坐一坐的小河边")]),t._v(" "),_("p",[t._v("\t哪家清吧价格不贵音乐好听 逼格还挺高")]),t._v(" "),_("p",[t._v("\t哪里的娃娃机很新 娃娃好看 放机器的商场很高档")]),t._v(" "),_("p",[t._v("\t哪里的艺术展 最近有什么")]),t._v(" "),_("p",[t._v("\t哪里的阳光好的咖啡厅吗")]),t._v(" "),_("p",[t._v("\t不要随便找 要花点心思 大众点评 小红书 实际看一下")]),t._v(" "),_("p",[t._v("\t地道的小吃 便宜还好吃 没来过")]),t._v(" "),_("p",[t._v("\t好玩的 娃娃机 碰碰车 划船 烧烤 风筝 郊游 农家乐 温泉 鬼屋 密室 桌游 电影 唱歌机 酒吧 ktv 水上乐园 游乐场 游泳池")]),t._v(" "),_("p",[t._v("\t文艺的 陶艺学习 双人烘焙 手工 艺术展 绘画体验 情人坡 情人湾 宁静小河边 艺术社区 图书馆 私人影院 旋转木马 摩天轮 清吧 踩单车 羽毛球馆 散步 跳舞")]),t._v(" "),_("p",[t._v("\t有逼格的 网红下午茶 咖啡厅 骑马 高尔夫 五星级酒店走廊 旅游")]),t._v(" "),_("p",[t._v("\t小红书 下午茶 骑马 卡丁车")]),t._v(" "),_("h2",{attrs:{id:"约会可以的流程"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#约会可以的流程"}},[t._v("#")]),t._v(" 约会可以的流程")]),t._v(" "),_("p",[t._v("加上微信后聊天不要超过三天 年龄 兴趣 爱好 工作"),_("br"),t._v("\n第一次 咖啡馆 奶茶店 看外貌 谈吐气质 了解思维方式和表达能力 感觉不错再去吃饭\n第二次 去游乐场和密室 看应变能力 对未知项目的开拓\n第三次 去打羽毛球 或其他运动 看默契程度\n第四次 去博物馆 去一些文创类地方 看品味和审美\n第五次 看消费观 帮对方挑选衣服")])])}),[],!1,null,null,null);v.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/22.b98bdf43.js b/assets/js/22.b98bdf43.js
new file mode 100644
index 0000000..150780e
--- /dev/null
+++ b/assets/js/22.b98bdf43.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{605:function(n,v,_){"use strict";_.r(v);var p=_(15),t=Object(p.a)({},(function(){var n=this,v=n.$createElement,_=n._self._c||v;return _("ContentSlotsDistributor",{attrs:{"slot-key":n.$parent.slotKey}},[_("h2",{attrs:{id:"亚瑟·阿伦三十六问"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#亚瑟·阿伦三十六问"}},[n._v("#")]),n._v(" 亚瑟·阿伦三十六问")]),n._v(" "),_("p",[n._v("1、在这个世界上,如果你可以选择一个人跟你共进晚餐,你会选择谁?")]),n._v(" "),_("p",[n._v("2、你有想过出名吗?通过什么方式?")]),n._v(" "),_("p",[n._v("3、在打电话前,你一般会练习怎么去表达吗?为什么?")]),n._v(" "),_("p",[n._v("4、你觉得在你的心里,完美的一天是什么样子?")]),n._v(" "),_("p",[n._v("5、你上一次一个人唱歌是什么时候呢?对其他人唱歌呢?")]),n._v(" "),_("p",[n._v("6、假设你可以活到90岁,那么在30岁后,你更倾向于身体年轻还是思想年轻,来躲过余下的60年呢?")]),n._v(" "),_("p",[n._v("7、你对你以后怎样死去,有没有预感?")]),n._v(" "),_("p",[n._v("8、说一下我们的三个共同点。")]),n._v(" "),_("p",[n._v("9、你这辈子最感激的是谁,或者是什么事?")]),n._v(" "),_("p",[n._v("10、如果你能改变你过去的经历,你想改变那件事?")]),n._v(" "),_("p",[n._v("11、用四分钟,尽可能详细的讲讲你从小到大的经历。")]),n._v(" "),_("p",[n._v("12、如果你明天醒来会获得一种新的才能,你希望是什么。")]),n._v(" "),_("p",[n._v("13、如果水晶球能告诉你关于你自己、你的生活、未来或其他任何事情的真相,你希望知道什么?")]),n._v(" "),_("p",[n._v("14、有没有长时间梦寐以求的事情,为什么你没有去实现?")]),n._v(" "),_("p",[n._v("15、你觉得自己最成功的是什么?")]),n._v(" "),_("p",[n._v("16、你觉得有用最珍贵的地方是什么?")]),n._v(" "),_("p",[n._v("17、你最宝贵的记忆是什么?")]),n._v(" "),_("p",[n._v("18、你最可怕的记忆是什么?")]),n._v(" "),_("p",[n._v("19、假设一年后你会突然去世,那么你会改变现在的生活方式吗?为什么?")]),n._v(" "),_("p",[n._v("20、友谊对于你来说意味着什么?")]),n._v(" "),_("p",[n._v("21、爱情和喜欢,在你生活中大概是什么样的角色?")]),n._v(" "),_("p",[n._v("22、说出5个关于我的好的特质。我也说5个关于你的。")]),n._v(" "),_("p",[n._v("23、你家里人之间亲密吗?你是不是觉得你的童年比其他大多数人更幸福?")]),n._v(" "),_("p",[n._v("24、你觉得你和你密码的关系是怎么样?")]),n._v(" "),_("p",[n._v("25、各种做三个围绕“我们”的事实陈述。例如,“我们在深夜一起聊天”。。。")]),n._v(" "),_("p",[n._v("26、给你一句句子,你把它补全:”我希望能有人和我一起分享。。。“")]),n._v(" "),_("p",[n._v("27、如果你要和我成为球迷的朋友,对你来说,最需要知道关于我的事情是什么?")]),n._v(" "),_("p",[n._v("28、告诉我你喜欢我什么;这次要非常诚实哦。")]),n._v(" "),_("p",[n._v("29、和我分享一件生活种令你尴尬的事情,可以是最近的事情。")]),n._v(" "),_("p",[n._v("30、你上次在别人面前哭是什么事情?那独自流泪是什么时候呢?")]),n._v(" "),_("p",[n._v("31、告诉我,我有哪些地方已经放你开始喜欢上了。")]),n._v(" "),_("p",[n._v("32、对你来说,有没有一些事严肃道不能开玩笑?")]),n._v(" "),_("p",[n._v("33、假设你今晚就要死了,而你再也没有机会和其他人甲流,那你最后悔没有告诉别人什么事?为什么还没有告诉他们。")]),n._v(" "),_("p",[n._v("34、你的房子着火了,你的所有东西都在里面,在救出你的亲人和宠物后,你有时间进去最后一次冲进去安全的救出最后一件物品,那将会是什么?为什么?")]),n._v(" "),_("p",[n._v("35、在你所有家人中,谁的离去最令你痛苦,为什么?")]),n._v(" "),_("p",[n._v("36、说一个你自己私人遇到的困扰,你说完我也说我的,然后我们互相给对方想办法。")]),n._v(" "),_("h2",{attrs:{id:"话题互相了解对方"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#话题互相了解对方"}},[n._v("#")]),n._v(" 话题互相了解对方")]),n._v(" "),_("p",[n._v("吃过最好吃的东西是什么\n目前最想做的事\n最想和对方做的事\n两个人的共同爱好\n讨论自己的兴趣爱好\n谈谈对方性格中的缺点\n最喜欢对方的哪—点\n遇见对方前是什么状态\n聊一聊初见对方的印象\n做过最让对方感动的事\n做过最浪漫的事\n做过最蠢的事\n生气时怎么解决问题\n对方最不好的习惯\n最欣赏对方的一点\n经历的最开心的事\n普及自己的兴趣爱好\n分享喝多后做过的糗事\n分享自己的旅行经历\n分享自己内心的小秘密\n分享做过最尴尬的事\n分享每天发生的趣事\n吐槽工作的烦恼\n最讨厌吃的东西是什么\n最喜欢的歌手是谁\n印象最深刻的一件事\n在一起后的幸福瞬间\n聊聊儿时的梦想\n儿时的学习状况\n最喜欢的动画片\n最怕的东西是什么\n想要拥有什么样的超能力\n疲惫的时候怎么放松自己\n当你陷入困境时你会向谁请教\n因为什么事情跟父母吵过架\n人生目前最大的成就是什么\n最近一次哭是什么时候为什么\n小时候的梦相是什么\n喜欢独处吗\n如果中了500万,你会怎么规划\n如果你打算写本书,你会写什么内容\n单曲循环最久的歌是哪一首\n想唱给对方的歌\n分享彼此的奇葩朋友\n遇到最难忘的囧事\n小时候怕爸爸还是妈妈\n我做过哪件事情让你很生气你\n是如何察觉我在生气的\n最喜欢吃的一道菜\n最想去哪个地方\n我让你难堪过吗\n喜欢什么游戏/音乐/电影/花/水果")]),n._v(" "),_("p",[n._v("9.你对彼此忠诚的定义是什么?\n10.给爱情下个定义?\n11.浪漫的度假作为你生活方式的一部分,你有何感受?\n12.你会因为一个什么样的小细节而对—个女人动心?\n13.你认为钱最主要的功能是?\n14.在什么样的情况下,你会放弃原则?\n15.你曾犯下的最大的措误是什么?它是如何改变你人生的?")]),n._v(" "),_("h2",{attrs:{id:"暧昧阶段"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#暧昧阶段"}},[n._v("#")]),n._v(" 暧昧阶段")]),n._v(" "),_("p",[n._v("这个阶段往往有过务次约会,彼此都有想进步的起法,再通过相对私密话题了解对方对感情的态度,否是合适的人?\n9.你喜欢什么样的工作环境?\n10.你最欣赏什么样的人?\n11.是否对自己的工作满意?\n12.喜欢独处么?\n13.平常去哪儿玩?\n14.最想去哪个城市工作?\n15.当你对某人有偏见时,你是怎么想的?\n16.你最好的脆友是谁?为什么?\n17.你是如何选择现在这项事业的?")]),n._v(" "),_("h2",{attrs:{id:"恋爱阶段"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#恋爱阶段"}},[n._v("#")]),n._v(" 恋爱阶段")]),n._v(" "),_("p",[n._v("如果以上话题你都史经解锁成功,而说明你们的关系就基本可我确定下来,接下来就是好好读恋爱培养感情让关系\n更稳定\n1.告诉我,你是何时发觉爱上我的?\n2.如果我想在生日.上给你一个惊喜.你希望是什么?\n3.你想要的完美爱情是什么样的?\n4.的有想过你30岁之后的人生会是什么样子么?\n5.我会是你值得信任的人吗?\n6.如果金钱不再是目标.你最大的追求会是什么?")])])}),[],!1,null,null,null);v.default=t.exports}}]);
\ No newline at end of file
diff --git a/assets/js/23.c61a42c5.js b/assets/js/23.c61a42c5.js
new file mode 100644
index 0000000..8a24082
--- /dev/null
+++ b/assets/js/23.c61a42c5.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{603:function(v,_,p){"use strict";p.r(_);var e=p(15),t=Object(e.a)({},(function(){var v=this,_=v.$createElement,p=v._self._c||_;return p("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[p("p",[v._v("22020年09月18日星期五16:52:45 CST")]),v._v(" "),p("p",[v._v("1、做个简单的自我介绍")]),v._v(" "),p("p",[v._v("2.这个项目都是多少个人做的?")]),v._v(" "),p("p",[v._v("3.后端就你一个人做的吗?")]),v._v(" "),p("p",[v._v("4.项目做了多久?")]),v._v(" "),p("p",[v._v("5.说一说项目中困扰你时间比较长的问题?")]),v._v(" "),p("p",[v._v("6.项目中你试花在搭建环境的时间比较长是吗?(我说了很多关于服务器代码是如何实现的,原理是什么)")]),v._v(" "),p("p",[v._v("7.用了2个nginx具体是如何做高可用的")]),v._v(" "),p("p",[v._v("8.2个nginx都是回同时使用的吗?还是只是使用其中一个")]),v._v(" "),p("p",[v._v("9.用的2个ip给前端使用是吗?部署在不同的机器上面吗?")]),v._v(" "),p("p",[v._v("10.有了解过,用一个ip可以使多个nginx相互切换,例如其中一个nginx异常,是要访问另外一个ip是吗")]),v._v(" "),p("p",[v._v("11.有了解过虚拟ip这个东西呢?")]),v._v(" "),p("p",[v._v("12.nginx配置的是用什么样的负载均衡算法?")]),v._v(" "),p("p",[v._v("13.有了解过哪些负载均衡算法呢?")]),v._v(" "),p("p",[v._v("14.知道nginx是如何做负载均衡的吗?(我提到nginx中的线程池和epoll )")]),v._v(" "),p("p",[v._v("15.服务器是如何在多个副本中进行数据同步的?")]),v._v(" "),p("p",[v._v("16.知道原理细节吗?")]),v._v(" "),p("p",[v._v("17.现在的部署下,在什么故障下,服务器能够正常使用?")]),v._v(" "),p("p",[v._v("18.只实现了读的高可用,写方面没有实现高可用是吗?")]),v._v(" "),p("p",[v._v("19.fastdfs在写数据上能不能也做高可用?")]),v._v(" "),p("p",[v._v("20.有没有了解过其他分布式存储的东西呢?(我说对网络编程,tcp,网络的原理会熟悉一些)")]),v._v(" "),p("p",[v._v("21.什么情况下做东西线程通信?")]),v._v(" "),p("p",[v._v("22.单线程非阻塞有什么问题吗?")]),v._v(" "),p("p",[v._v("23.让你设计一个网络工具,你会用多线程同步阻塞的方式吗?")]),v._v(" "),p("p",[v._v("24.说一下你对epoll的了解?")]),v._v(" "),p("p",[v._v("25.说一下select的区别?")]),v._v(" "),p("p",[v._v("26.什么情况下适合用select,什么情况下适合使用epoll ?")]),v._v(" "),p("p",[v._v("27.为什么1024个连接的时候适合用select ?")]),v._v(" "),p("p",[v._v("28.为什么你认为select适合做1024个以下的连接?")]),v._v(" "),p("p",[v._v("29.平时select和 epoll都有写过吗?(我提到reactor)")]),v._v(" "),p("p",[v._v("30.说一下reactor和preactor的区别?")]),v._v(" "),p("p",[v._v("31.先说一下select是不是reactor ?")]),v._v(" "),p("p",[v._v("32.你是说epoll是同步的方式,reactor是异步的方式吗?")]),v._v(" "),p("p",[v._v("33.reactor这个概念你是从哪里了解到的?")]),v._v(" "),p("p",[v._v("34.一般搜索东西是在哪里搜索?")]),v._v(" "),p("p",[v._v("35.直接上csdn上面搜索吗?")]),v._v(" "),p("p",[v._v("36.为什么不直接用google搜索吗?是因为csdn上面搜索的东西比较适合你看吗?")]),v._v(" "),p("p",[v._v("37.你用epoll是来实现个什么东西?是应用还是练习?")]),v._v(" "),p("p",[v._v("38.关于epoll中处理数据的时候,你是如何处理的?")]),v._v(" "),p("p",[v._v("39.epoll的边沿触发和水平触发了解吗?")]),v._v(" "),p("p",[v._v("40.在使用上你是如何用边沿触发还是水平触发的?")]),v._v(" "),p("p",[v._v("41.如何设置边沿触发和水平触发的?")]),v._v(" "),p("p",[v._v("42.数据处理上是如何设计的?")]),v._v(" "),p("p",[v._v("43.以前有写过聊天室之类的通信呢?协议是如何设计的?")]),v._v(" "),p("p",[v._v("44.聊天室是你大学的时候做的吗?")]),v._v(" "),p("p",[v._v("45.你写socket变成的话,你试如何处理这些接口的错误的?")]),v._v(" "),p("p",[v._v("46.recv返回-1的话就是错误吗?")]),v._v(" "),p("p",[v._v("47.工作中为什么要用redis做这个token呢?")]),v._v(" "),p("p",[v._v("48.redis有了解过是如何做持久化的呢?")]),v._v(" "),p("p",[v._v("49.redis数据结构有了解哪些呢?")]),v._v(" "),p("p",[v._v("50.有序的set是如何实现的?")]),v._v(" "),p("p",[v._v("51.在这个公司还有别的工作体现你的水平的东西吗?")]),v._v(" "),p("p",[v._v("52.看你有用mmap,说一下mmap是什么?")]),v._v(" "),p("p",[v._v("53.你觉得哪些场景可以用mmap ?(我说了开发板的屏幕映射)")]),v._v(" "),p("p",[v._v("54.做软件开发的时候什么时候会用到mmap ?(我说了netmap用户态协议栈)")]),v._v(" "),p("p",[v._v("55.共享内存有了解过吗? linux一般如何去实现共享内存的?(shm)")]),v._v(" "),p("p",[v._v("56.你的主要开发语言是c/c是吧?平时写c多还是c ?")]),v._v(" "),p("p",[v._v("57.c11了解吗?平时你们使用的是c11吗还是老版本?")]),v._v(" "),p("p",[v._v("58.智能指针有了解吗?(我说 auto ptr ,unique ptr , shared ptr , weak ptr )")]),v._v(" "),p("p",[v._v("59.说一下上述智能指针的区别?")]),v._v(" "),p("p",[v._v("60.平时有用过哪一些指针?")]),v._v(" "),p("p",[v._v("61.C++里面右值引用什么意思?")]),v._v(" "),p("p",[v._v("62.多态是如何实现的?核心原理是什么?")]),v._v(" "),p("p",[v._v("63.你们平时如何去定位内存泄露的问题?")]),v._v(" "),p("p",[v._v("64.你是基本只做c/c++语言是吧?")]),v._v(" "),p("p",[v._v("65.第一家公司是做什么工作的呢?")]),v._v(" "),p("p",[v._v("66.你为什么会选择离开第一家公司呢?")]),v._v(" "),p("p",[v._v("67.为什么会离开第二家公司呢?")]),v._v(" "),p("p",[v._v("68.为什么毕业的时候会选择第一家做机顶盒的公司呢?")]),v._v(" "),p("p",[v._v("69.毕业找工作的时候有其他的offer选择呢?")]),v._v(" "),p("p",[v._v("70.大学的时候就是做嵌入式吗?")]),v._v(" "),p("p",[v._v("71.那你对游戏行业有了解过吗?了解多少?")]),v._v(" "),p("p",[v._v("72.你为什么会投游戏行业呢?对游戏后台了解吗?")]),v._v(" "),p("p",[v._v("73.对音视频哪些了解过吗?")]),v._v(" "),p("p",[v._v("74.平时玩游戏吗?")]),v._v(" "),p("p",[v._v("75.你现在找工作是只要是后端就可以是吧?游戏后端可以?音视频后端?服务器后端?都是有兴趣的是吧?")]),v._v(" "),p("p",[v._v("76.平时会通过什么样的途径去学习呢?")]),v._v(" "),p("p",[v._v("77.你平时一般看书多—些呢?还是上网看博客,看视屏多一些?")]),v._v(" "),p("p",[v._v("78.你最近在学的是什么呢?(我说有在学用户态协议栈的一些东西,netmap")]),v._v(" "),p("p",[v._v("79.是指tcp/ip协议吗?http协议哪些吗?(我大概说来一下netmap的原理)")]),v._v(" "),p("p",[v._v("80.说到拷贝的话,0拷贝这些有了解过吗?")]),v._v(" "),p("p",[v._v("81.还有了解到别的0拷贝的应用吗?")]),v._v(" "),p("p",[v._v("82.你现在工作是要加班吗?几点到几点?(每天都是10点,11点以后)")]),v._v(" "),p("p",[v._v("83.你们业务开发很多吗?你一般事情做完了会是几点?你对工作时间是如何看的?")]),v._v(" "),p("p",[v._v("84.长期10点多和11点多下班的话,个人能坚持吗?能接受吗?")]),v._v(" "),p("p",[v._v("85.平时周末或者节假日突然需要修bug的时候有吗?")]),v._v(" "),p("p",[v._v("86.你现在有女朋友吗?在那里?")]),v._v(" "),p("p",[v._v("87.你是哪里人?你现在在广州哪里?")]),v._v(" "),p("p",[v._v("88.你了解过我们公司的位置吗?")])])}),[],!1,null,null,null);_.default=t.exports}}]);
\ No newline at end of file
diff --git a/assets/js/24.3e59a9da.js b/assets/js/24.3e59a9da.js
new file mode 100644
index 0000000..17e671e
--- /dev/null
+++ b/assets/js/24.3e59a9da.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{606:function(v,_,p){"use strict";p.r(_);var t=p(15),e=Object(t.a)({},(function(){var v=this,_=v.$createElement,p=v._self._c||_;return p("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[p("p",[v._v("深信服网络安全2020年09月14日星期一12:47:05 CST")]),v._v(" "),p("p",[v._v("1.简单的介绍一下自己擅长的技能")]),v._v(" "),p("p",[v._v("2.工作中主要还是做c/c++是吗?json也是用c/C++写的吗?")]),v._v(" "),p("p",[v._v("3.c/C+ + static的使用场景是什么?")]),v._v(" "),p("p",[v._v("4.C++为什么要使用extern C ,才能调用c文件的内容?<")]),v._v(" "),p("p",[v._v("5.定义局部数组和直接使用new/malloc分配的内存有什么不一样?")]),v._v(" "),p("p",[v._v("6.栈上面分配数组最大可以分配多少内存?")]),v._v(" "),p("p",[v._v("7.free/delete是如何知道需要释放的内存段有多大?◆")]),v._v(" "),p("p",[v._v("8.空指针和野指针的区别?")]),v._v(" "),p("p",[v._v("9.场景, 2个线程分别有2个指针, p1, p2 ,都指向了同一-片内存,现在释放掉p1 ,内存已经被释放了,但是现在p2也要释放内存, 这个时候会出问题吗?怎么解决? ( 引用计数,互斥锁,无锁cas")]),v._v(" "),p("p",[v._v("10.通常计算字符串长度使用strlen , sizeof能计算字符串的长度吗?")]),v._v(" "),p("p",[v._v("11.算法题,判断一个数是否是2的n次方")]),v._v(" "),p("p",[v._v("12.进程和线程的区别")]),v._v(" "),p("p",[v._v("13.案例题,你需要综合考虑;多核cpu场景,使用多线程的场景去设计数据的手法,数据的计算,整体协调的效率达到最大。简单的当做网络接口的接收和")]),v._v(" "),p("p",[v._v("发送 epoll 线程池 协程")]),v._v(" "),p("p",[v._v("14.tcp和udp的区别")]),v._v(" "),p("p",[v._v("15.socket套接字变成,服务器端都有哪些函数,功能是什么")]),v._v(" "),p("p",[v._v("16.网络编程,网络协议栈有没有了解")]),v._v(" "),p("p",[v._v("17.类似于epoll这样的技术,你是如何学习的?")]),v._v(" "),p("p",[v._v("18.除了c/c+ +平时还接触其他语言吗?")]),v._v(" "),p("p",[v._v("19.go语言有接触过吗?")]),v._v(" "),p("p",[v._v("深信服二面2020年09月16日星期三14:33:02 CST")]),v._v(" "),p("p",[v._v("1.用什么语言来做的这个服务器?")]),v._v(" "),p("p",[v._v("2.(啊?怎么用c/c+ +来做? )并发能有多少?")]),v._v(" "),p("p",[v._v("3.我觉得20w比较悬,能做到20w并发不太可能")]),v._v(" "),p("p",[v._v("4.有没有做断点续传的功能,闪存(秒传)的功能,如何做的?")]),v._v(" "),p("p",[v._v("5.你们是提供给别人sdk吗?")]),v._v(" "),p("p",[v._v("6.如何验证文件的md5值,细节?")]),v._v(" "),p("p",[v._v("7.如果用http chunk编码的方式如何做?")]),v._v(" "),p("p",[v._v("8.全部都用你的客户端上传文件,你没有办法控制文件的格式和安全的?")]),v._v(" "),p("p",[v._v("9.浏览器想去在线打开你的文件,你为什么不支持chunk编码的方式?")]),v._v(" "),p("p",[v._v("10.你理解http的chunk编码吗?")]),v._v(" "),p("p",[v._v("11.鉴权如何做,用户权限是如何做的?")]),v._v(" "),p("p",[v._v("12.上传文件带了哪些验证信息,具体技术实现细节?")]),v._v(" "),p("p",[v._v("13.上传文件,二进制流你也是放在json里面吗?")]),v._v(" "),p("p",[v._v("14.我是黑客的话就不按你的流程走,直接把文件传到你的服务器里面,这个怎么办?")]),v._v(" "),p("p",[v._v("15.token是明文的话,很容易被别人拿到,这个是很不安全的,如何处理?")]),v._v(" "),p("p",[v._v("16.token的做法,文件上传的做法,需要说的更加清楚和细节-一些")]),v._v(" "),p("p",[v._v("17.这样做不行,如果不对上传文件做校验的话,这样做是有问题的,是存在漏洞的")]),v._v(" "),p("p",[v._v("18.http明显有一个auth的字段为什么不用 ,你现在做的这样是不合理的")]),v._v(" "),p("p",[v._v("19.你还有做过其他的一一些项目吗,互联网的")]),v._v(" "),p("p",[v._v("20.有做过linux内核网络层的项目开发吗?")]),v._v(" "),p("p",[v._v("21.网络通信这一块有别的项目经验吗?自己去做的scoket项目有吗?")]),v._v(" "),p("p",[v._v("22.socket阻塞和非阻塞有什么区别?如何写?")]),v._v(" "),p("p",[v._v("23.recv返回-1有哪几种情况要处理?")]),v._v(" "),p("p",[v._v("24.看你还做了linux内核移植的,是做过内核的编程呢还是编译?")]),v._v(" "),p("p",[v._v("25.有把哪一一个开源技术研究的比较深的经历吗,搞的比较透的那种?")]),v._v(" "),p("p",[v._v("26.做的项目过程中,有没有遇到最困难,最难查的bug ,如何解决的?我是要看你解决问题的深度")]),v._v(" "),p("p",[v._v("27.你说的这些都是基本的调试技术,这是必须会的,你有让你印象比较深刻的很难的")]),v._v(" "),p("p",[v._v("28.你看下你那边还有什么项目可以证明你能力的?")]),v._v(" "),p("p",[v._v("29.你在网络这一块相对比较有经验-点对吧,网络编程这一块")]),v._v(" "),p("p",[v._v("30.有兴趣学其他的语言吗?比如go语言, python语言")]),v._v(" "),p("p",[v._v("31.介绍一些你过往比较快学习- 一个技术且掌握的案例吗?")]),v._v(" "),p("p",[v._v("32.有看过哪些书籍?看看你的学识能力")]),v._v(" "),p("p",[v._v("我问的问题")]),v._v(" "),p("p",[v._v("1.这个岗位核心技能是网络相关的技能还是安全的技能")]),v._v(" "),p("p",[v._v("●大部分主要还是网络这一块的,对内核的编程要有一些了解,应用层的编程也是需")]),v._v(" "),p("p",[v._v("●刚才和你说的chunk编码类似的会用到openssl做加密,你对openssI有了解过吗")]),v._v(" "),p("p",[v._v("●要对网络层的各种协议要搞的很熟,例如gre ,例如unix网络编程, tcp/ip详解")])])}),[],!1,null,null,null);_.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/25.3423b9d6.js b/assets/js/25.3423b9d6.js
new file mode 100644
index 0000000..809e654
--- /dev/null
+++ b/assets/js/25.3423b9d6.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{607:function(e,s,t){"use strict";t.r(s);var a=t(15),r=Object(a.a)({},(function(){var e=this,s=e.$createElement,t=e._self._c||s;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[t("img",{attrs:{src:"https://img.shields.io/badge/vuepress-0.14.8-brightgreen.svg",alt:"vuepress"}}),e._v(" "),t("img",{attrs:{src:"https://img.shields.io/badge/leancloud--storage-3.10.1-orange.svg",alt:"leancloud-storage"}}),e._v(" "),t("img",{attrs:{src:"https://img.shields.io/badge/valine-1.3.4-blue.svg",alt:"valine"}})]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"title"},[e._v("介绍")]),t("ol",[t("li",[e._v("这是一个vuepress主题,旨在添加博客所需的分类、TAB墙、分页、评论等能;"),t("br")]),e._v(" "),t("li",[e._v("主题追求极简,根据 vuepress 的默认主题修改而成,官方的主题配置仍然适用;"),t("br")]),e._v(" "),t("li",[e._v("你可以打开 "),t("a",{attrs:{href:"http://recoluan.gitlab.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("午后南杂"),t("OutboundLink")],1),e._v(" 来查看效果。")])])]),t("h2",{attrs:{id:"use"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use"}},[e._v("#")]),e._v(" Use")]),e._v(" "),t("p",[t("strong",[e._v("Build")])]),e._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("npm")]),e._v(" run build\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# or")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("yarn")]),e._v(" build\n")])]),e._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[e._v("1")]),t("br"),t("span",{staticClass:"line-number"},[e._v("2")]),t("br"),t("span",{staticClass:"line-number"},[e._v("3")]),t("br"),t("span",{staticClass:"line-number"},[e._v("4")]),t("br"),t("span",{staticClass:"line-number"},[e._v("5")]),t("br")])]),t("p",[t("strong",[e._v("Server")])]),e._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("npm")]),e._v(" run dev\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# or")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("yarn")]),e._v(" dev\n")])]),e._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[e._v("1")]),t("br"),t("span",{staticClass:"line-number"},[e._v("2")]),t("br"),t("span",{staticClass:"line-number"},[e._v("3")]),t("br"),t("span",{staticClass:"line-number"},[e._v("4")]),t("br"),t("span",{staticClass:"line-number"},[e._v("5")]),t("br")])]),t("h2",{attrs:{id:"play-together"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#play-together"}},[e._v("#")]),e._v(" Play Together")]),e._v(" "),t("h3",{attrs:{id:"_0-x"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-x"}},[e._v("#")]),e._v(" 0.x")]),e._v(" "),t("p",[t("code",[e._v("vuepress-theme-reco@0.x")]),e._v(" 是基于 "),t("code",[e._v("vuepress@0.x")]),e._v(" 的博客主题。")]),e._v(" "),t("p",[t("code",[e._v("vuepress@0.x")]),e._v(" 功能比较简单,只适合书写简单的文档,但好在支持主题自定义,而个人又希望能够用它来书写博客,原因就是它足够的简洁,毫无疑问,这也符合很多程序员的观念,也就是在这种情况下,"),t("code",[e._v("vuepress-theme-reco@0.x")]),e._v(" 的第一个版本经过一个通宵而产生。")]),e._v(" "),t("p",[e._v("主题开源不久,很多朋友通过各种联系方式,给到很多好的意见和建议,所以我个人也在积极地更新。")]),e._v(" "),t("p",[e._v("因为我是一名前端开发工程师,开发的过程中,总是想着能不能加入一些炫酷的效果,有很多次都是添加上又去掉,反反复复,最后都是被 "),t("strong",[e._v("简洁")]),e._v(" 的这个原则阻止掉,毕竟,现在我是将它当作一个产品来看待,并不是一个技术或者是技巧的尝试项目。")]),e._v(" "),t("h3",{attrs:{id:"_1-x"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-x"}},[e._v("#")]),e._v(" 1.x")]),e._v(" "),t("p",[e._v("随着不断有用户过来询问:为什么 "),t("code",[e._v("vuepress-theme-reco@0.x")]),e._v(" 不能在 "),t("code",[e._v("vuepress@1.x")]),e._v(" 上使用?本来只是打算对 "),t("code",[e._v("vuepress-theme-reco@0.x")]),e._v(" 进行简单的bug修复的我,终究还是忍不住,开始了 "),t("code",[e._v("vuepress-theme-reco@1.x")]),e._v(" 的开发。又是在一个寂静的凌晨两点半(晚上就是出活快),我默默地开始了。")]),e._v(" "),t("p",[e._v("主题升级的关键也就是 "),t("code",[e._v("@vuepress/plugin-blog")]),e._v(" 这款官方插件,它不需要再去麻烦地过滤数据,将分类和标签的相关信息直接存在 "),t("code",[e._v("$categories")]),e._v(" 和 "),t("code",[e._v("$tags")]),e._v(" 这两个全局变量中。借助于 "),t("code",[e._v("@vuepress/plugin-blog")]),e._v(",分类和标签功能更容易实现,但也有了一些局限。接下来两三天的时间,都是在进行功能的迁移和一些bug的修复。")]),e._v(" "),t("p",[t("code",[e._v("vuepress-theme-reco@0.x")]),e._v(" 的开发中,更加深刻地明白了模块化和组件化编程的重要性,如果当初没有把一些功能进行封装,而是直接简单的复制,这次升级也不会这么顺利。模块拆分的越细,使用就会越灵活。")]),e._v(" "),t("h3",{attrs:{id:"cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cli"}},[e._v("#")]),e._v(" CLI")]),e._v(" "),t("p",[e._v("还是衷心地希望能有更多的朋友参与进来,更快地去完善它。接下来时间允许的情况下,我会开源一款自动生成博客的脚手架,略过配置步骤,直接书写优质内容,这也是我后来逐渐形成的一种信念,就是希望能让这款主题,功能越完善,使用越来越简单。")]),e._v(" "),t("h2",{attrs:{id:"license"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#license"}},[e._v("#")]),e._v(" License")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/recoluan/vuepress-theme-reco/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[e._v("MIT"),t("OutboundLink")],1)])])}),[],!1,null,null,null);s.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/26.14b116b2.js b/assets/js/26.14b116b2.js
new file mode 100644
index 0000000..7e8f099
--- /dev/null
+++ b/assets/js/26.14b116b2.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{608:function(_,v,t){"use strict";t.r(v);var r=t(15),a=Object(r.a)({},(function(){var _=this,v=_.$createElement,t=_._self._c||v;return t("ContentSlotsDistributor",{attrs:{"slot-key":_.$parent.slotKey}},[t("h1",{attrs:{id:"一级标题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#一级标题"}},[_._v("#")]),_._v(" 一级标题")]),_._v(" "),t("h2",{attrs:{id:"二级标题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#二级标题"}},[_._v("#")]),_._v(" 二级标题")]),_._v(" "),t("h3",{attrs:{id:"三级标题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#三级标题"}},[_._v("#")]),_._v(" 三级标题")]),_._v(" "),t("h4",{attrs:{id:"四级标题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#四级标题"}},[_._v("#")]),_._v(" 四级标题")]),_._v(" "),t("h5",{attrs:{id:"五级标题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#五级标题"}},[_._v("#")]),_._v(" 五级标题")]),_._v(" "),t("h6",{attrs:{id:"六级标题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#六级标题"}},[_._v("#")]),_._v(" 六级标题")]),_._v(" "),t("p",[t("em",[_._v("斜体文字")])]),_._v(" "),t("p",[t("em",[_._v("斜体文字")])]),_._v(" "),t("p",[t("strong",[_._v("粗体文字")])]),_._v(" "),t("p",[t("strong",[_._v("粗体文字")])]),_._v(" "),t("p",[t("em",[t("strong",[_._v("粗斜体文字")])])]),_._v(" "),t("p",[t("em",[t("strong",[_._v("粗斜体文字")])])]),_._v(" "),t("p",[_._v("分割线")]),_._v(" "),t("hr"),_._v(" "),t("hr"),_._v(" "),t("hr"),_._v(" "),t("hr"),_._v(" "),t("hr"),_._v(" "),t("p",[_._v("删除线")]),_._v(" "),t("p",[_._v("baidu.com\nsina.com\n"),t("s",[_._v("tencent.com")])]),_._v(" "),t("p",[t("u",[_._v("带下划线文本")])]),_._v(" "),t("p",[_._v("[^要注明的文本]:")]),_._v(" "),t("ul",[t("li",[_._v("第一项")]),_._v(" "),t("li",[_._v("第二项")]),_._v(" "),t("li",[_._v("第三项")])]),_._v(" "),t("ul",[t("li",[_._v("第一项")]),_._v(" "),t("li",[_._v("第二项")]),_._v(" "),t("li",[_._v("第三项")])]),_._v(" "),t("ul",[t("li",[_._v("第一项")]),_._v(" "),t("li",[_._v("第二项")]),_._v(" "),t("li",[_._v("第三项")])]),_._v(" "),t("ol",[t("li",[_._v("第一项:\n"),t("ul",[t("li",[_._v("第一项嵌套的第一个元素")]),_._v(" "),t("li",[_._v("第一项嵌套的第二个元素")])])]),_._v(" "),t("li",[_._v("第二项:\n"),t("ul",[t("li",[_._v("第二项嵌套的第一个元素")]),_._v(" "),t("li",[_._v("第二项嵌套的第二个元素")])])])]),_._v(" "),t("blockquote",[t("p",[_._v("最外层")]),_._v(" "),t("blockquote",[t("p",[_._v("第一层嵌套")]),_._v(" "),t("blockquote",[t("p",[_._v("第二层嵌套")])])])]),_._v(" "),t("p",[_._v("'print()' 函数")]),_._v(" "),t("p",[_._v("代码区块")]),_._v(" "),t("p",[_._v("'''javascript\n$(document).read(function(){\nalert('Markdown');\n});\n'''")]),_._v(" "),t("p",[t("a",{attrs:{href:"%E9%93%BE%E6%8E%A5%E5%9C%B0%E5%9D%80"}},[_._v("链接名称")]),_._v("\n或者\n<链接地址>")]),_._v(" "),t("p",[_._v("这是一个链接 "),t("a",{attrs:{href:"https://news.sina.com.cn/",target:"_blank",rel:"noopener noreferrer"}},[_._v("新浪新闻"),t("OutboundLink")],1),_._v(" "),t("a",{attrs:{href:"https://news.sina.com.cn/",target:"_blank",rel:"noopener noreferrer"}},[_._v("https://news.sina.com.cn/"),t("OutboundLink")],1)]),_._v(" "),t("p",[t("img",{attrs:{src:"https://pic4.zhimg.com/80/v2-a47051e92cf74930bedd7469978e6c08_hd.png",alt:"有问题上知乎 图标"}})]),_._v(" "),t("table",[t("thead",[t("tr",[t("th",[_._v("表头1")]),_._v(" "),t("th",[_._v("表头2")])])]),_._v(" "),t("tbody",[t("tr",[t("td",[_._v("单元格11")]),_._v(" "),t("td",[_._v("单元格12")])]),_._v(" "),t("tr",[t("td",[_._v("单元格21")]),_._v(" "),t("td",[_._v("单元格22")])])])]),_._v(" "),t("p",[_._v("使用"),t("kbd",[_._v("Ctrl")]),_._v("+"),t("kbd",[_._v("Alt")]),_._v("+"),t("kbd",[_._v("Del")]),_._v("重启电脑")]),_._v(" "),t("p",[t("strong",[_._v("文本加粗")]),_._v("\n**正常显示星号**")]),_._v(" "),t("p",[_._v("$$\n\\int_0^1 {x^2} ,{\\rm d}x\n$$")])])}),[],!1,null,null,null);v.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/27.946e74f9.js b/assets/js/27.946e74f9.js
new file mode 100644
index 0000000..a56c0c7
--- /dev/null
+++ b/assets/js/27.946e74f9.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{609:function(t,e,n){"use strict";n.r(e);var s=n(15),i=Object(s.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("second page in redis")])])}),[],!1,null,null,null);e.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/28.33fa0677.js b/assets/js/28.33fa0677.js
new file mode 100644
index 0000000..05b5e08
--- /dev/null
+++ b/assets/js/28.33fa0677.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{610:function(t,e,n){"use strict";n.r(e);var s=n(15),l=Object(s.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("1111111")])])}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/29.6f72c1d3.js b/assets/js/29.6f72c1d3.js
new file mode 100644
index 0000000..3a2744b
--- /dev/null
+++ b/assets/js/29.6f72c1d3.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{611:function(t,e,n){"use strict";n.r(e);var s=n(15),i=Object(s.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("first page in zmq")])])}),[],!1,null,null,null);e.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/3.5a4097ad.js b/assets/js/3.5a4097ad.js
new file mode 100644
index 0000000..8e15d9c
--- /dev/null
+++ b/assets/js/3.5a4097ad.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{493:function(t,e,a){},494:function(t,e,a){},495:function(t,e,a){},498:function(t,e,a){},499:function(t,e,a){"use strict";a(91);var n=a(159),r=a(491),o=a(490),s=Object(n.b)({components:{RecoIcon:r.b},props:{pageInfo:{type:Object,default:function(){return{}}},currentTag:{type:String,default:""},showAccessNumber:{type:Boolean,default:!1}},setup:function(t,e){var a=Object(o.a)();return{numStyle:{fontSize:".9rem",fontWeight:"normal",color:"#999"},goTags:function(t){a.$route.path!=="/tag/".concat(t,"/")&&a.$router.push({path:"/tag/".concat(t,"/")})},formatDateValue:function(t){return new Intl.DateTimeFormat(a.$lang).format(new Date(t))}}}}),i=(a(500),a(15)),c=Object(i.a)(s,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",[t.pageInfo.frontmatter.author||t.$themeConfig.author?a("reco-icon",{attrs:{icon:"reco-account"}},[a("span",[t._v(t._s(t.pageInfo.frontmatter.author||t.$themeConfig.author))])]):t._e(),t._v(" "),t.pageInfo.frontmatter.date?a("reco-icon",{attrs:{icon:"reco-date"}},[a("span",[t._v(t._s(t.formatDateValue(t.pageInfo.frontmatter.date)))])]):t._e(),t._v(" "),!0===t.showAccessNumber?a("reco-icon",{attrs:{icon:"reco-eye"}},[a("AccessNumber",{attrs:{idVal:t.pageInfo.path,numStyle:t.numStyle}})],1):t._e(),t._v(" "),t.pageInfo.frontmatter.tags?a("reco-icon",{staticClass:"tags",attrs:{icon:"reco-tag"}},t._l(t.pageInfo.frontmatter.tags,(function(e,n){return a("span",{key:n,staticClass:"tag-item",class:{active:t.currentTag==e},on:{click:function(a){return a.stopPropagation(),t.goTags(e)}}},[t._v(t._s(e))])})),0):t._e()],1)}),[],!1,null,"f875f3fc",null);e.a=c.exports},500:function(t,e,a){"use strict";a(493)},501:function(t,e,a){"use strict";a(494)},502:function(t,e,a){"use strict";a(495)},503:function(t,e,a){"use strict";a(43);var n=a(159),r=(a(161),a(264),{methods:{_getStoragePage:function(){var t=window.location.pathname,e=JSON.parse(sessionStorage.getItem("currentPage"));return null===e||t!==e.path?(sessionStorage.setItem("currentPage",JSON.stringify({page:1,path:""})),1):parseInt(e.page)},_setStoragePage:function(t){var e=window.location.pathname;sessionStorage.setItem("currentPage",JSON.stringify({page:t,path:e}))}}}),o=a(491),s=a(499),i=Object(n.b)({components:{PageInfo:s.a,RecoIcon:o.b},props:["item","currentPage","currentTag"]}),c=(a(501),a(15)),l=Object(c.a)(i,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-item",on:{click:function(e){return t.$router.push(t.item.path)}}},[t.item.frontmatter.sticky?a("reco-icon",{attrs:{icon:"reco-sticky"}}):t._e(),t._v(" "),a("div",{staticClass:"title"},[t.item.frontmatter.keys?a("reco-icon",{attrs:{icon:"reco-lock"}}):t._e(),t._v(" "),a("router-link",{attrs:{to:t.item.path}},[t._v(t._s(t.item.title))])],1),t._v(" "),a("div",{staticClass:"abstract",domProps:{innerHTML:t._s(t.item.excerpt)}}),t._v(" "),a("PageInfo",{attrs:{pageInfo:t.item,currentTag:t.currentTag}})],1)}),[],!1,null,"ff2c8be0",null).exports,u=a(490),p=Object(n.b)({mixins:[r],components:{NoteAbstractItem:l},props:["data","currentTag"],setup:function(t,e){var a=Object(u.a)(),r=Object(n.h)(t).data,o=Object(n.g)(1),s=Object(n.a)((function(){var t=(o.value-1)*a.$perPage,e=o.value*a.$perPage;return r.value.slice(t,e)}));return Object(n.d)((function(){o.value=a._getStoragePage()||1})),{currentPage:o,currentPageData:s,getCurrentPage:function(t){o.value=t,a._setStoragePage(t),e.emit("paginationChange",t)}}},watch:{$route:function(){this.currentPage=this._getStoragePage()||1}}}),f=(a(502),Object(c.a)(p,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-wrapper"},[t._l(t.currentPageData,(function(e){return a("NoteAbstractItem",{key:e.path,attrs:{item:e,currentPage:t.currentPage,currentTag:t.currentTag}})})),t._v(" "),a("pagation",{staticClass:"pagation",attrs:{total:t.data.length,currentPage:t.currentPage},on:{getCurrentPage:t.getCurrentPage}})],2)}),[],!1,null,"6cc0658a",null));e.a=f.exports},506:function(t,e,a){"use strict";a(498)},508:function(t,e,a){"use strict";var n=a(66),r=(a(160),a(159)),o=a(120),s=a(490),i=Object(r.b)({props:{currentTag:{type:String,default:""}},setup:function(t,e){var a=Object(s.a)();return{tags:Object(r.a)((function(){return[{name:a.$recoLocales.all,path:"/tag/"}].concat(Object(n.a)(a.$tagesList))})),tagClick:function(t){e.emit("getCurrentTag",t)},getOneColor:o.b}}}),c=(a(506),a(15)),l=Object(c.a)(i,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"tags"},t._l(t.tags,(function(e,n){return a("span",{directives:[{name:"show",rawName:"v-show",value:!e.pages||e.pages&&e.pages.length>0,expression:"!item.pages || (item.pages && item.pages.length > 0)"}],key:n,class:{active:e.name==t.currentTag},style:{backgroundColor:t.getOneColor()},on:{click:function(a){return t.tagClick(e)}}},[t._v(t._s(e.name))])})),0)}),[],!1,null,"285c9a44",null);e.a=l.exports},530:function(t,e,a){},531:function(t,e,a){},532:function(t,e,a){},533:function(t,e,a){},534:function(t,e,a){},535:function(t,e,a){},536:function(t,e,a){},537:function(t,e,a){},572:function(t,e,a){"use strict";a(530)},573:function(t,e,a){"use strict";a(531)},574:function(t,e,a){t.exports=a.p+"assets/img/bg.2cfdbb33.svg"},575:function(t,e,a){"use strict";a(532)},576:function(t,e,a){"use strict";a(533)},577:function(t,e,a){"use strict";a(534)},578:function(t){t.exports=JSON.parse('{"a":"1.6.10"}')},579:function(t,e,a){"use strict";a(535)},580:function(t,e,a){"use strict";a(536)},581:function(t,e,a){"use strict";a(537)},586:function(t,e,a){"use strict";a.r(e);var n=a(159),r=a(510),o=a(491),s=a(490),i=Object(n.b)({components:{NavLink:r.a,ModuleTransition:o.a},setup:function(t,e){var a=Object(s.a)();return{recoShowModule:Object(n.a)((function(){return a&&a.$parent.recoShowModule})),actionLink:Object(n.a)((function(){return a&&{link:a.$frontmatter.actionLink,text:a.$frontmatter.actionText}})),heroImageStyle:Object(n.a)((function(){return a.$frontmatter.heroImageStyle||{maxHeight:"200px",margin:"6rem auto 1.5rem"}}))}}}),c=(a(572),a(15)),l=Object(c.a)(i,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"home"},[a("div",{staticClass:"hero"},[a("ModuleTransition",[t.recoShowModule&&t.$frontmatter.heroImage?a("img",{style:t.heroImageStyle||{},attrs:{src:t.$withBase(t.$frontmatter.heroImage),alt:"hero"}}):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.04"}},[t.recoShowModule&&null!==t.$frontmatter.heroText?a("h1",{style:{marginTop:t.$frontmatter.heroImage?"0px":"140px"}},[t._v("\n "+t._s(t.$frontmatter.heroText||t.$title||"vuePress-theme-reco")+"\n ")]):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.08"}},[t.recoShowModule&&null!==t.$frontmatter.tagline?a("p",{staticClass:"description"},[t._v("\n "+t._s(t.$frontmatter.tagline||t.$description||"Welcome to your vuePress-theme-reco site")+"\n ")]):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.16"}},[t.recoShowModule&&t.$frontmatter.actionText&&t.$frontmatter.actionLink?a("p",{staticClass:"action"},[a("NavLink",{staticClass:"action-button",attrs:{item:t.actionLink}})],1):t._e()])],1),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.24"}},[t.recoShowModule&&t.$frontmatter.features&&t.$frontmatter.features.length?a("div",{staticClass:"features"},t._l(t.$frontmatter.features,(function(e,n){return a("div",{key:n,staticClass:"feature"},[a("h2",[t._v(t._s(e.title))]),t._v(" "),a("p",[t._v(t._s(e.details))])])})),0):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.32"}},[a("Content",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"home-center",attrs:{custom:""}})],1)],1)}),[],!1,null,null,null).exports,u=a(17),p=(a(90),a(508)),f=(a(27),a(63),a(49),a(525)),g=a.n(f),d=a(120),m=function(){var t=Object(s.a)(),e=Object(n.g)(!0),a=Object(n.f)({left:0,top:0});return Object(n.d)((function(){e.value=!/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)})),{popupWindowStyle:a,showDetail:function(n){var r=n.target;r.querySelector(".popup-window-wrapper").style.display="block";var o=r.querySelector(".popup-window"),s=document.querySelector(".info-wrapper"),i=r.clientWidth,c=o.clientWidth,l=o.clientHeight;if(e)a.left=(i-c)/2+"px",a.top=-l+"px",s.style.overflow="visible",t.$nextTick((function(){!function(t){var e=document.body.offsetWidth,n=t.getBoundingClientRect(),r=e-(n.x+n.width);if(r<0){var o=t.offsetLeft;a.left=o+r+"px"}}(o)}));else{var u=function(t){var e=document,a=t.getBoundingClientRect(),n=a.left,r=a.top;return{left:n+=e.documentElement.scrollLeft||e.body.scrollLeft,top:r+=e.documentElement.scrollTop||e.body.scrollTop}};s.style.overflow="hidden";var p=u(r).left-u(s).left;a.left=-p+(s.clientWidth-o.clientWidth)/2+"px",a.top=-l+"px"}},hideDetail:function(t){t.target.querySelector(".popup-window-wrapper").style.display="none"}}},h=Object(n.b)({setup:function(t,e){var a=Object(s.a)(),r=m(),o=r.popupWindowStyle,i=r.showDetail,c=r.hideDetail;return{dataAddColor:Object(n.a)((function(){var t=(a&&a.$themeConfig).friendLink;return(void 0===t?[]:t).map((function(t){return t.color=Object(d.b)(),t}))})),popupWindowStyle:o,showDetail:i,hideDetail:c,getImgUrl:function(t){var e=t.logo,n=void 0===e?"":e,r=t.email,o=void 0===r?"":r;return n&&/^http/.test(n)?n:n&&!/^http/.test(n)?a.$withBase(n):"//1.gravatar.com/avatar/".concat(g()(o||""),"?s=50&d=mm&r=x")}}}}),v=(a(573),Object(c.a)(h,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"friend-link-wrapper"},t._l(t.dataAddColor,(function(e,n){return a("div",{key:n,staticClass:"friend-link-item",attrs:{target:"_blank"},on:{mouseenter:function(e){return t.showDetail(e)},mouseleave:function(e){return t.hideDetail(e)}}},[a("span",{staticClass:"list-style",style:{backgroundColor:e.color}}),t._v("\n "+t._s(e.title)+"\n "),a("transition",{attrs:{name:"fade"}},[a("div",{staticClass:"popup-window-wrapper"},[a("div",{ref:"popupWindow",refInFor:!0,staticClass:"popup-window",style:t.popupWindowStyle},[a("div",{staticClass:"logo"},[a("img",{attrs:{src:t.getImgUrl(e)}})]),t._v(" "),a("div",{staticClass:"info"},[a("div",{staticClass:"title"},[a("h4",[t._v(t._s(e.title))]),t._v(" "),a("a",{staticClass:"btn-go",style:{backgroundColor:e.color},attrs:{href:e.link,target:"_blank"}},[t._v("GO")])]),t._v(" "),e.desc?a("p",[t._v(t._s(e.desc))]):t._e()])])])])],1)})),0)}),[],!1,null,"165dc218",null).exports),_=a(503),b=a(543),C=Object(n.b)({components:{NoteAbstract:_.a,TagList:p.a,FriendLink:v,ModuleTransition:o.a,PersonalInfo:b.a,RecoIcon:o.b},setup:function(t,e){var r=Object(s.a)(),o=Object(n.f)({recoShow:!1,heroHeight:0}),i=Object(n.a)((function(){return r&&r.$parent.recoShowModule})),c=Object(n.a)((function(){return r.$frontmatter.heroImageStyle||{}})),l=Object(n.a)((function(){var t=r.$frontmatter.bgImage?r.$withBase(r.$frontmatter.bgImage):a(574),e={textAlign:"center",overflow:"hidden",background:"url(".concat(t,") center/cover no-repeat")},n=r.$frontmatter.bgImageStyle;return n?Object(u.a)(Object(u.a)({},e),n):e}));return Object(n.d)((function(){o.heroHeight=document.querySelector(".hero").clientHeight,o.recoShow=!0})),Object(u.a)(Object(u.a)({recoShowModule:i,heroImageStyle:c,bgImageStyle:l},Object(n.h)(o)),{},{getOneColor:d.b})},methods:{paginationChange:function(t){var e=this;setTimeout((function(){window.scrollTo(0,e.heroHeight)}),100)},getPagesByTags:function(t){this.$router.push({path:t.path})}}}),w=(a(575),Object(c.a)(C,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"home-blog"},[a("div",{staticClass:"hero",style:Object.assign({},t.bgImageStyle)},[a("div",[a("ModuleTransition",[t.recoShowModule&&t.$frontmatter.heroImage?a("img",{staticClass:"hero-img",style:t.heroImageStyle||{},attrs:{src:t.$withBase(t.$frontmatter.heroImage),alt:"hero"}}):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.04"}},[t.recoShowModule&&null!==t.$frontmatter.heroText?a("h1",[t._v("\n "+t._s(t.$frontmatter.heroText||t.$title||"vuePress-theme-reco")+"\n ")]):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.08"}},[t.recoShowModule&&null!==t.$frontmatter.tagline?a("p",{staticClass:"description"},[t._v("\n "+t._s(t.$frontmatter.tagline||t.$description||"Welcome to your vuePress-theme-reco site")+"\n ")]):t._e()])],1)]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.16"}},[a("div",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"home-blog-wrapper"},[a("div",{staticClass:"blog-list"},[a("note-abstract",{attrs:{data:t.$recoPosts},on:{paginationChange:t.paginationChange}})],1),t._v(" "),a("div",{staticClass:"info-wrapper"},[a("PersonalInfo"),t._v(" "),a("h4",[a("reco-icon",{attrs:{icon:"reco-category"}}),t._v(" "+t._s(t.$recoLocales.category))],1),t._v(" "),a("ul",{staticClass:"category-wrapper"},t._l(this.$categories.list,(function(e,n){return a("li",{key:n,staticClass:"category-item"},[a("router-link",{attrs:{to:e.path}},[a("span",{staticClass:"category-name"},[t._v(t._s(e.name))]),t._v(" "),a("span",{staticClass:"post-num",style:{backgroundColor:t.getOneColor()}},[t._v(t._s(e.pages.length))])])],1)})),0),t._v(" "),a("hr"),t._v(" "),0!==t.$tags.list.length?a("h4",[a("reco-icon",{attrs:{icon:"reco-tag"}}),t._v(" "+t._s(t.$recoLocales.tag))],1):t._e(),t._v(" "),a("TagList",{on:{getCurrentTag:t.getPagesByTags}}),t._v(" "),t.$themeConfig.friendLink&&0!==t.$themeConfig.friendLink.length?a("h4",[a("reco-icon",{attrs:{icon:"reco-friend"}}),t._v(" "+t._s(t.$recoLocales.friendLink))],1):t._e(),t._v(" "),a("FriendLink")],1)])]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.24"}},[a("Content",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"home-center",attrs:{custom:""}})],1)],1)}),[],!1,null,null,null).exports),$=(a(64),a(499)),y=a(50),O=a(88),S=a(66),j=(a(160),Object(n.b)({setup:function(t,e){var a=Object(s.a)();return{headers:Object(n.a)((function(){return a.$showSubSideBar?a.$page.headers:[]})),isLinkActive:function(t){var e=Object(y.e)(a.$route,a.$page.path+"#"+t.slug);return e&&setTimeout((function(){document.querySelector(".reco-side-".concat(t.slug)).scrollIntoView()}),300),e}}},render:function(t){var e=this;return t("ul",{class:{"sub-sidebar-wrapper":!0},style:{width:this.headers.length>0?"12rem":"0"}},Object(S.a)(this.headers.map((function(a){return t("li",{class:Object(O.a)({active:e.isLinkActive(a)},"level-".concat(a.level),!0),attr:{key:a.title}},[t("router-link",{class:Object(O.a)({"sidebar-link":!0},"reco-side-".concat(a.slug),!0),props:{to:"".concat(e.$page.path,"#").concat(a.slug)}},a.title)])}))))}})),k=(a(576),Object(c.a)(j,void 0,void 0,!1,null,"cb1513f6",null).exports);function T(t,e,a){var n=[];!function t(e,a){for(var n=0,r=e.length;n0,expression:"!item.pages || (item.pages && item.pages.length > 0)"}],key:n,class:{active:e.name==t.currentTag},style:{backgroundColor:t.getOneColor()},on:{click:function(a){return t.tagClick(e)}}},[t._v(t._s(e.name))])})),0)}),[],!1,null,"285c9a44",null);e.a=u.exports},538:function(t,e,a){},582:function(t,e,a){"use strict";a(538)},589:function(t,e,a){"use strict";a.r(e);a(90);var n=a(159),r=a(507),o=a(503),c=a(508),s=a(491),i=a(87),u=a(504),g=a(490),l=Object(n.b)({mixins:[u.a],components:{Common:r.a,NoteAbstract:o.a,TagList:c.a,ModuleTransition:s.a},setup:function(t,e){var a=Object(g.a)();return{posts:Object(n.a)((function(){var t=a.$currentTags.pages;return t=Object(i.a)(t),Object(i.c)(t),t})),getCurrentTag:function(t){e.emit("currentTag",t)},tagClick:function(t){a.$route.path!==t.path&&a.$router.push({path:t.path})},paginationChange:function(t){setTimeout((function(){window.scrollTo(0,0)}),100)}}}}),p=(a(496),a(505),a(582),a(15)),f=Object(p.a)(l,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("Common",{staticClass:"tag-wrapper",attrs:{sidebar:!1}},[a("ModuleTransition",[a("TagList",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"tags",attrs:{currentTag:t.$currentTags.key},on:{getCurrentTag:t.tagClick}})],1),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.08"}},[a("note-abstract",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"list",attrs:{data:t.posts,currentTag:t.$currentTags.key},on:{paginationChange:t.paginationChange}})],1)],1)}),[],!1,null,"25a0fadc",null);e.default=f.exports}}]);
\ No newline at end of file
diff --git a/assets/js/5.eb8174c0.js b/assets/js/5.eb8174c0.js
new file mode 100644
index 0000000..ba275b3
--- /dev/null
+++ b/assets/js/5.eb8174c0.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{492:function(t,e,a){},493:function(t,e,a){},494:function(t,e,a){},495:function(t,e,a){},496:function(t,e,a){"use strict";a(492)},497:function(t,e,a){},498:function(t,e,a){},499:function(t,e,a){"use strict";a(91);var n=a(159),r=a(491),o=a(490),c=Object(n.b)({components:{RecoIcon:r.b},props:{pageInfo:{type:Object,default:function(){return{}}},currentTag:{type:String,default:""},showAccessNumber:{type:Boolean,default:!1}},setup:function(t,e){var a=Object(o.a)();return{numStyle:{fontSize:".9rem",fontWeight:"normal",color:"#999"},goTags:function(t){a.$route.path!=="/tag/".concat(t,"/")&&a.$router.push({path:"/tag/".concat(t,"/")})},formatDateValue:function(t){return new Intl.DateTimeFormat(a.$lang).format(new Date(t))}}}}),s=(a(500),a(15)),i=Object(s.a)(c,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",[t.pageInfo.frontmatter.author||t.$themeConfig.author?a("reco-icon",{attrs:{icon:"reco-account"}},[a("span",[t._v(t._s(t.pageInfo.frontmatter.author||t.$themeConfig.author))])]):t._e(),t._v(" "),t.pageInfo.frontmatter.date?a("reco-icon",{attrs:{icon:"reco-date"}},[a("span",[t._v(t._s(t.formatDateValue(t.pageInfo.frontmatter.date)))])]):t._e(),t._v(" "),!0===t.showAccessNumber?a("reco-icon",{attrs:{icon:"reco-eye"}},[a("AccessNumber",{attrs:{idVal:t.pageInfo.path,numStyle:t.numStyle}})],1):t._e(),t._v(" "),t.pageInfo.frontmatter.tags?a("reco-icon",{staticClass:"tags",attrs:{icon:"reco-tag"}},t._l(t.pageInfo.frontmatter.tags,(function(e,n){return a("span",{key:n,staticClass:"tag-item",class:{active:t.currentTag==e},on:{click:function(a){return a.stopPropagation(),t.goTags(e)}}},[t._v(t._s(e))])})),0):t._e()],1)}),[],!1,null,"f875f3fc",null);e.a=i.exports},500:function(t,e,a){"use strict";a(493)},501:function(t,e,a){"use strict";a(494)},502:function(t,e,a){"use strict";a(495)},503:function(t,e,a){"use strict";a(43);var n=a(159),r=(a(161),a(264),{methods:{_getStoragePage:function(){var t=window.location.pathname,e=JSON.parse(sessionStorage.getItem("currentPage"));return null===e||t!==e.path?(sessionStorage.setItem("currentPage",JSON.stringify({page:1,path:""})),1):parseInt(e.page)},_setStoragePage:function(t){var e=window.location.pathname;sessionStorage.setItem("currentPage",JSON.stringify({page:t,path:e}))}}}),o=a(491),c=a(499),s=Object(n.b)({components:{PageInfo:c.a,RecoIcon:o.b},props:["item","currentPage","currentTag"]}),i=(a(501),a(15)),u=Object(i.a)(s,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-item",on:{click:function(e){return t.$router.push(t.item.path)}}},[t.item.frontmatter.sticky?a("reco-icon",{attrs:{icon:"reco-sticky"}}):t._e(),t._v(" "),a("div",{staticClass:"title"},[t.item.frontmatter.keys?a("reco-icon",{attrs:{icon:"reco-lock"}}):t._e(),t._v(" "),a("router-link",{attrs:{to:t.item.path}},[t._v(t._s(t.item.title))])],1),t._v(" "),a("div",{staticClass:"abstract",domProps:{innerHTML:t._s(t.item.excerpt)}}),t._v(" "),a("PageInfo",{attrs:{pageInfo:t.item,currentTag:t.currentTag}})],1)}),[],!1,null,"ff2c8be0",null).exports,g=a(490),l=Object(n.b)({mixins:[r],components:{NoteAbstractItem:u},props:["data","currentTag"],setup:function(t,e){var a=Object(g.a)(),r=Object(n.h)(t).data,o=Object(n.g)(1),c=Object(n.a)((function(){var t=(o.value-1)*a.$perPage,e=o.value*a.$perPage;return r.value.slice(t,e)}));return Object(n.d)((function(){o.value=a._getStoragePage()||1})),{currentPage:o,currentPageData:c,getCurrentPage:function(t){o.value=t,a._setStoragePage(t),e.emit("paginationChange",t)}}},watch:{$route:function(){this.currentPage=this._getStoragePage()||1}}}),p=(a(502),Object(i.a)(l,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-wrapper"},[t._l(t.currentPageData,(function(e){return a("NoteAbstractItem",{key:e.path,attrs:{item:e,currentPage:t.currentPage,currentTag:t.currentTag}})})),t._v(" "),a("pagation",{staticClass:"pagation",attrs:{total:t.data.length,currentPage:t.currentPage},on:{getCurrentPage:t.getCurrentPage}})],2)}),[],!1,null,"6cc0658a",null));e.a=p.exports},505:function(t,e,a){"use strict";a(497)},506:function(t,e,a){"use strict";a(498)},508:function(t,e,a){"use strict";var n=a(66),r=(a(160),a(159)),o=a(120),c=a(490),s=Object(r.b)({props:{currentTag:{type:String,default:""}},setup:function(t,e){var a=Object(c.a)();return{tags:Object(r.a)((function(){return[{name:a.$recoLocales.all,path:"/tag/"}].concat(Object(n.a)(a.$tagesList))})),tagClick:function(t){e.emit("getCurrentTag",t)},getOneColor:o.b}}}),i=(a(506),a(15)),u=Object(i.a)(s,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"tags"},t._l(t.tags,(function(e,n){return a("span",{directives:[{name:"show",rawName:"v-show",value:!e.pages||e.pages&&e.pages.length>0,expression:"!item.pages || (item.pages && item.pages.length > 0)"}],key:n,class:{active:e.name==t.currentTag},style:{backgroundColor:t.getOneColor()},on:{click:function(a){return t.tagClick(e)}}},[t._v(t._s(e.name))])})),0)}),[],!1,null,"285c9a44",null);e.a=u.exports},539:function(t,e,a){},583:function(t,e,a){"use strict";a(539)},590:function(t,e,a){"use strict";a.r(e);a(90);var n=a(159),r=a(507),o=a(508),c=a(503),s=a(491),i=a(504),u=a(490),g=Object(n.b)({mixins:[i.a],components:{Common:r.a,NoteAbstract:c.a,TagList:o.a,ModuleTransition:s.a},setup:function(t,e){var a=Object(u.a)();return{tagClick:function(t){a.$route.path!==t.path&&a.$router.push({path:t.path})},paginationChange:function(t){setTimeout((function(){window.scrollTo(0,0)}),100)}}}}),l=(a(496),a(505),a(583),a(15)),p=Object(l.a)(g,(function(){var t=this.$createElement,e=this._self._c||t;return e("Common",{staticClass:"tags-wrapper",attrs:{sidebar:!1}},[e("ModuleTransition",[e("TagList",{directives:[{name:"show",rawName:"v-show",value:this.recoShowModule,expression:"recoShowModule"}],attrs:{currentTag:this.$recoLocales.all},on:{getCurrentTag:this.tagClick}})],1),this._v(" "),e("ModuleTransition",{attrs:{delay:"0.08"}},[e("note-abstract",{directives:[{name:"show",rawName:"v-show",value:this.recoShowModule,expression:"recoShowModule"}],staticClass:"list",attrs:{data:this.$recoPosts},on:{paginationChange:this.paginationChange}})],1)],1)}),[],!1,null,"615c9794",null);e.default=p.exports}}]);
\ No newline at end of file
diff --git a/assets/js/6.6356d18d.js b/assets/js/6.6356d18d.js
new file mode 100644
index 0000000..adacdea
--- /dev/null
+++ b/assets/js/6.6356d18d.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{492:function(t,e,a){},493:function(t,e,a){},494:function(t,e,a){},495:function(t,e,a){},496:function(t,e,a){"use strict";a(492)},497:function(t,e,a){},499:function(t,e,a){"use strict";a(91);var n=a(159),r=a(491),o=a(490),c=Object(n.b)({components:{RecoIcon:r.b},props:{pageInfo:{type:Object,default:function(){return{}}},currentTag:{type:String,default:""},showAccessNumber:{type:Boolean,default:!1}},setup:function(t,e){var a=Object(o.a)();return{numStyle:{fontSize:".9rem",fontWeight:"normal",color:"#999"},goTags:function(t){a.$route.path!=="/tag/".concat(t,"/")&&a.$router.push({path:"/tag/".concat(t,"/")})},formatDateValue:function(t){return new Intl.DateTimeFormat(a.$lang).format(new Date(t))}}}}),s=(a(500),a(15)),i=Object(s.a)(c,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",[t.pageInfo.frontmatter.author||t.$themeConfig.author?a("reco-icon",{attrs:{icon:"reco-account"}},[a("span",[t._v(t._s(t.pageInfo.frontmatter.author||t.$themeConfig.author))])]):t._e(),t._v(" "),t.pageInfo.frontmatter.date?a("reco-icon",{attrs:{icon:"reco-date"}},[a("span",[t._v(t._s(t.formatDateValue(t.pageInfo.frontmatter.date)))])]):t._e(),t._v(" "),!0===t.showAccessNumber?a("reco-icon",{attrs:{icon:"reco-eye"}},[a("AccessNumber",{attrs:{idVal:t.pageInfo.path,numStyle:t.numStyle}})],1):t._e(),t._v(" "),t.pageInfo.frontmatter.tags?a("reco-icon",{staticClass:"tags",attrs:{icon:"reco-tag"}},t._l(t.pageInfo.frontmatter.tags,(function(e,n){return a("span",{key:n,staticClass:"tag-item",class:{active:t.currentTag==e},on:{click:function(a){return a.stopPropagation(),t.goTags(e)}}},[t._v(t._s(e))])})),0):t._e()],1)}),[],!1,null,"f875f3fc",null);e.a=i.exports},500:function(t,e,a){"use strict";a(493)},501:function(t,e,a){"use strict";a(494)},502:function(t,e,a){"use strict";a(495)},503:function(t,e,a){"use strict";a(43);var n=a(159),r=(a(161),a(264),{methods:{_getStoragePage:function(){var t=window.location.pathname,e=JSON.parse(sessionStorage.getItem("currentPage"));return null===e||t!==e.path?(sessionStorage.setItem("currentPage",JSON.stringify({page:1,path:""})),1):parseInt(e.page)},_setStoragePage:function(t){var e=window.location.pathname;sessionStorage.setItem("currentPage",JSON.stringify({page:t,path:e}))}}}),o=a(491),c=a(499),s=Object(n.b)({components:{PageInfo:c.a,RecoIcon:o.b},props:["item","currentPage","currentTag"]}),i=(a(501),a(15)),u=Object(i.a)(s,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-item",on:{click:function(e){return t.$router.push(t.item.path)}}},[t.item.frontmatter.sticky?a("reco-icon",{attrs:{icon:"reco-sticky"}}):t._e(),t._v(" "),a("div",{staticClass:"title"},[t.item.frontmatter.keys?a("reco-icon",{attrs:{icon:"reco-lock"}}):t._e(),t._v(" "),a("router-link",{attrs:{to:t.item.path}},[t._v(t._s(t.item.title))])],1),t._v(" "),a("div",{staticClass:"abstract",domProps:{innerHTML:t._s(t.item.excerpt)}}),t._v(" "),a("PageInfo",{attrs:{pageInfo:t.item,currentTag:t.currentTag}})],1)}),[],!1,null,"ff2c8be0",null).exports,g=a(490),l=Object(n.b)({mixins:[r],components:{NoteAbstractItem:u},props:["data","currentTag"],setup:function(t,e){var a=Object(g.a)(),r=Object(n.h)(t).data,o=Object(n.g)(1),c=Object(n.a)((function(){var t=(o.value-1)*a.$perPage,e=o.value*a.$perPage;return r.value.slice(t,e)}));return Object(n.d)((function(){o.value=a._getStoragePage()||1})),{currentPage:o,currentPageData:c,getCurrentPage:function(t){o.value=t,a._setStoragePage(t),e.emit("paginationChange",t)}}},watch:{$route:function(){this.currentPage=this._getStoragePage()||1}}}),p=(a(502),Object(i.a)(l,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-wrapper"},[t._l(t.currentPageData,(function(e){return a("NoteAbstractItem",{key:e.path,attrs:{item:e,currentPage:t.currentPage,currentTag:t.currentTag}})})),t._v(" "),a("pagation",{staticClass:"pagation",attrs:{total:t.data.length,currentPage:t.currentPage},on:{getCurrentPage:t.getCurrentPage}})],2)}),[],!1,null,"6cc0658a",null));e.a=p.exports},505:function(t,e,a){"use strict";a(497)},529:function(t,e,a){},571:function(t,e,a){"use strict";a(529)},588:function(t,e,a){"use strict";a.r(e);a(90);var n=a(159),r=a(507),o=a(503),c=a(491),s=a(87),i=a(120),u=a(504),g=a(490),l=Object(n.b)({mixins:[u.a],components:{Common:r.a,NoteAbstract:o.a,ModuleTransition:c.a},setup:function(t,e){var a=Object(g.a)();return{posts:Object(n.a)((function(){var t=a.$currentCategories.pages;return t=Object(s.a)(t),Object(s.c)(t),t})),title:Object(n.a)((function(){return a.$currentCategories.key})),getCurrentTag:function(t){e.emit("currentTag",t)},paginationChange:function(t){setTimeout((function(){window.scrollTo(0,0)}),100)},getOneColor:i.b}}}),p=(a(496),a(505),a(571),a(15)),f=Object(p.a)(l,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("Common",{staticClass:"categories-wrapper",attrs:{sidebar:!1}},[a("ModuleTransition",[a("ul",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"category-wrapper"},t._l(t.$categoriesList,(function(e,n){return a("li",{directives:[{name:"show",rawName:"v-show",value:e.pages.length>0,expression:"item.pages.length > 0"}],key:n,staticClass:"category-item",class:t.title==e.name?"active":""},[a("router-link",{attrs:{to:e.path}},[a("span",{staticClass:"category-name"},[t._v(t._s(e.name))]),t._v(" "),a("span",{staticClass:"post-num",style:{backgroundColor:t.getOneColor()}},[t._v(t._s(e.pages.length))])])],1)})),0)]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.08"}},[a("note-abstract",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"list",attrs:{data:t.posts},on:{paginationChange:t.paginationChange}})],1)],1)}),[],!1,null,"1e68bc8d",null);e.default=f.exports}}]);
\ No newline at end of file
diff --git a/assets/js/7.2141c153.js b/assets/js/7.2141c153.js
new file mode 100644
index 0000000..8cb8955
--- /dev/null
+++ b/assets/js/7.2141c153.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{490:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));n(44),n(45);var o=n(96);function r(){var e=Object(o.d)();if(!e)throw new Error("must be called in setup");return e||{}}},492:function(e,t,n){},496:function(e,t,n){"use strict";n(492)},511:function(e,t,n){},545:function(e,t,n){"use strict";n(511)},587:function(e,t,n){"use strict";n.r(t);var o=n(159),r=n(490),c=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],u=Object(o.b)({setup:function(e,t){var n=Object(r.a)(),u=Object(o.a)((function(){return!1!==n.$themeConfig.noFoundPageByTencent}));return Object(o.d)((function(){if(u.value){var e=document.createElement("script");e.setAttribute("homePageName","回到首页"),e.setAttribute("homePageUrl",n.$site.base),e.setAttribute("src","//qzonestyle.gtimg.cn/qzone/hybrid/app/404/search_children.js"),document.body.append(e)}})),{noFoundPageByTencent:u,getMsg:function(){return c[Math.floor(Math.random()*c.length)]}}}}),s=(n(496),n(545),n(15)),i=Object(s.a)(u,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.noFoundPageByTencent?e._e():n("section",{staticClass:"theme-container"},[n("article",{staticClass:"content"},[n("h1",[e._v("404")]),e._v(" "),n("blockquote",[e._v(e._s(e.getMsg()))]),e._v(" "),n("router-link",{attrs:{to:"/"}},[e._v("Take me home.")])],1)])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/8.e3d6ceb6.js b/assets/js/8.e3d6ceb6.js
new file mode 100644
index 0000000..5fdb273
--- /dev/null
+++ b/assets/js/8.e3d6ceb6.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{492:function(e,t,n){},496:function(e,t,n){"use strict";n(492)},540:function(e,t,n){},584:function(e,t,n){"use strict";n(540)},591:function(e,t,n){"use strict";n.r(t);n(266),n(267),n(91),n(27),n(64),n(268),n(160);var a=n(159),o=n(507),s=n(491),r=n(504),i=n(490),c=Object(a.b)({name:"TimeLine",mixins:[r.a],components:{Common:o.a,ModuleTransition:s.a},setup:function(e,t){var n=Object(i.a)();return{go:function(e){n.$router.push({path:e})},dateFormat:function(e,t){e=function(e){var t=new Date(e).toJSON();return new Date(+new Date(t)+288e5).toISOString().replace(/T/g," ").replace(/\.[\d]{3}Z/,"").replace(/-/g,"/")}(e);var n=new Date(e),a=n.getMonth()+1,o=n.getDate();return"".concat(a,"-").concat(o)}}}}),l=(n(496),n(584),n(15)),u=Object(l.a)(c,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("Common",{staticClass:"timeline-wrapper",attrs:{sidebar:!1}},[n("ul",{staticClass:"timeline-content"},[n("ModuleTransition",[n("li",{directives:[{name:"show",rawName:"v-show",value:e.recoShowModule,expression:"recoShowModule"}],staticClass:"desc"},[e._v(e._s(e.$recoLocales.timeLineMsg))])]),e._v(" "),e._l(e.$recoPostsForTimeline,(function(t,a){return n("ModuleTransition",{key:a,attrs:{delay:String(.08*(a+1))}},[n("li",{directives:[{name:"show",rawName:"v-show",value:e.recoShowModule,expression:"recoShowModule"}]},[n("h3",{staticClass:"year"},[e._v(e._s(t.year))]),e._v(" "),n("ul",{staticClass:"year-wrapper"},e._l(t.data,(function(t,a){return n("li",{key:a},[n("span",{staticClass:"date"},[e._v(e._s(e.dateFormat(t.frontmatter.date)))]),e._v(" "),n("span",{staticClass:"title",on:{click:function(n){return e.go(t.path)}}},[e._v(e._s(t.title))])])})),0)])])}))],2)])}),[],!1,null,"42b59284",null);t.default=u.exports}}]);
\ No newline at end of file
diff --git a/assets/js/9.973d1d99.js b/assets/js/9.973d1d99.js
new file mode 100644
index 0000000..f11a335
--- /dev/null
+++ b/assets/js/9.973d1d99.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{541:function(t,e,n){},585:function(t,e,n){"use strict";n(541)},616:function(t,e,n){"use strict";n.r(e);var i=n(159),r=Object(i.b)({functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:function(t,e){var n=e.props,i=e.slots;return t("span",{class:["badge",n.type],style:{verticalAlign:n.vertical}},n.text||i().default)}}),p=(n(585),n(15)),a=Object(p.a)(r,void 0,void 0,!1,null,"08862138",null);e.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/app.72629fdf.js b/assets/js/app.72629fdf.js
new file mode 100644
index 0000000..b47ed87
--- /dev/null
+++ b/assets/js/app.72629fdf.js
@@ -0,0 +1,58 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],u=e[1],c=e[2],f=0,p=[];f=0&&Math.floor(e)===e&&isFinite(t)}function d(t){return i(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function h(t){return null==t?"":Array.isArray(t)||l(t)&&t.toString===c?JSON.stringify(t,null,2):String(t)}function v(t){var e=parseFloat(t);return isNaN(e)?t:e}function g(t,e){for(var n=Object.create(null),r=t.split(","),o=0;o-1)return t.splice(n,1)}}var b=Object.prototype.hasOwnProperty;function w(t,e){return b.call(t,e)}function x(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var _=/-(\w)/g,k=x((function(t){return t.replace(_,(function(t,e){return e?e.toUpperCase():""}))})),A=x((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),C=/\B([A-Z])/g,D=x((function(t){return t.replace(C,"-$1").toLowerCase()}));var E=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function S(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function O(t,e){for(var n in e)t[n]=e[n];return t}function $(t){for(var e={},n=0;n0,J=Q&&Q.indexOf("edge/")>0,Z=(Q&&Q.indexOf("android"),Q&&/iphone|ipad|ipod|ios/.test(Q)||"ios"===G),X=(Q&&/chrome\/\d+/.test(Q),Q&&/phantomjs/.test(Q),Q&&Q.match(/firefox\/(\d+)/)),tt={}.watch,et=!1;if(H)try{var nt={};Object.defineProperty(nt,"passive",{get:function(){et=!0}}),window.addEventListener("test-passive",null,nt)}catch(t){}var rt=function(){return void 0===q&&(q=!H&&!W&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),q},ot=H&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function it(t){return"function"==typeof t&&/native code/.test(t.toString())}var at,st="undefined"!=typeof Symbol&&it(Symbol)&&"undefined"!=typeof Reflect&&it(Reflect.ownKeys);at="undefined"!=typeof Set&&it(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var ut=j,ct=0,lt=function(){this.id=ct++,this.subs=[]};lt.prototype.addSub=function(t){this.subs.push(t)},lt.prototype.removeSub=function(t){y(this.subs,t)},lt.prototype.depend=function(){lt.target&<.target.addDep(this)},lt.prototype.notify=function(){var t=this.subs.slice();for(var e=0,n=t.length;e-1)if(i&&!w(o,"default"))a=!1;else if(""===a||a===D(t)){var u=Ut(String,o.type);(u<0||s0&&(fe((u=t(u,(n||"")+"_"+r))[0])&&fe(l)&&(f[c]=mt(l.text+u[0].text),u.shift()),f.push.apply(f,u)):s(u)?fe(l)?f[c]=mt(l.text+u):""!==u&&f.push(mt(u)):fe(u)&&fe(l)?f[c]=mt(l.text+u.text):(a(e._isVList)&&i(u.tag)&&o(u.key)&&i(n)&&(u.key="__vlist"+n+"_"+r+"__"),f.push(u)));return f}(t):void 0}function fe(t){return i(t)&&i(t.text)&&!1===t.isComment}function pe(t,e){if(t){for(var n=Object.create(null),r=st?Reflect.ownKeys(t):Object.keys(t),o=0;o0,a=t?!!t.$stable:!i,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&n&&n!==r&&s===n.$key&&!i&&!n.$hasNormal)return n;for(var u in o={},t)t[u]&&"$"!==u[0]&&(o[u]=me(e,u,t[u]))}else o={};for(var c in e)c in o||(o[c]=ye(e,c));return t&&Object.isExtensible(t)&&(t._normalized=o),N(o,"$stable",a),N(o,"$key",s),N(o,"$hasNormal",i),o}function me(t,e,n){var r=function(){var t=arguments.length?n.apply(null,arguments):n({}),e=(t=t&&"object"==typeof t&&!Array.isArray(t)?[t]:le(t))&&t[0];return t&&(!e||1===t.length&&e.isComment&&!ve(e))?void 0:t};return n.proxy&&Object.defineProperty(t,e,{get:r,enumerable:!0,configurable:!0}),r}function ye(t,e){return function(){return t[e]}}function be(t,e){var n,r,o,a,s;if(Array.isArray(t)||"string"==typeof t)for(n=new Array(t.length),r=0,o=t.length;rdocument.createEvent("Event").timeStamp&&(cn=function(){return ln.now()})}function fn(){var t,e;for(un=cn(),an=!0,en.sort((function(t,e){return t.id-e.id})),sn=0;snsn&&en[n].id>t.id;)n--;en.splice(n+1,0,t)}else en.push(t);on||(on=!0,ne(fn))}}(this)},dn.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||u(t)||this.deep){var e=this.value;if(this.value=t,this.user){var n='callback for watcher "'+this.expression+'"';Vt(this.cb,this.vm,[t,e],this.vm,n)}else this.cb.call(this.vm,t,e)}}},dn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},dn.prototype.depend=function(){for(var t=this.deps.length;t--;)this.deps[t].depend()},dn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||y(this.vm._watchers,this);for(var t=this.deps.length;t--;)this.deps[t].removeSub(this);this.active=!1}};var hn={enumerable:!0,configurable:!0,get:j,set:j};function vn(t,e,n){hn.get=function(){return this[e][n]},hn.set=function(t){this[e][n]=t},Object.defineProperty(t,n,hn)}function gn(t){t._watchers=[];var e=t.$options;e.props&&function(t,e){var n=t.$options.propsData||{},r=t._props={},o=t.$options._propKeys=[];t.$parent&&kt(!1);var i=function(i){o.push(i);var a=Lt(i,e,n,t);Dt(r,i,a),i in t||vn(t,"_props",i)};for(var a in e)i(a);kt(!0)}(t,e.props),e.methods&&function(t,e){t.$options.props;for(var n in e)t[n]="function"!=typeof e[n]?j:E(e[n],t)}(t,e.methods),e.data?function(t){var e=t.$options.data;l(e=t._data="function"==typeof e?function(t,e){pt();try{return t.call(e,e)}catch(t){return qt(t,e,"data()"),{}}finally{dt()}}(e,t):e||{})||(e={});var n=Object.keys(e),r=t.$options.props,o=(t.$options.methods,n.length);for(;o--;){var i=n[o];0,r&&w(r,i)||(a=void 0,36!==(a=(i+"").charCodeAt(0))&&95!==a&&vn(t,"_data",i))}var a;Ct(e,!0)}(t):Ct(t._data={},!0),e.computed&&function(t,e){var n=t._computedWatchers=Object.create(null),r=rt();for(var o in e){var i=e[o],a="function"==typeof i?i:i.get;0,r||(n[o]=new dn(t,a||j,j,mn)),o in t||yn(t,o,i)}}(t,e.computed),e.watch&&e.watch!==tt&&function(t,e){for(var n in e){var r=e[n];if(Array.isArray(r))for(var o=0;o-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!f(t)&&t.test(e)}function Sn(t,e){var n=t.cache,r=t.keys,o=t._vnode;for(var i in n){var a=n[i];if(a){var s=a.name;s&&!e(s)&&On(n,i,r,o)}}}function On(t,e,n,r){var o=t[e];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),t[e]=null,y(n,e)}!function(t){t.prototype._init=function(t){var e=this;e._uid=_n++,e._isVue=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=Rt(kn(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Ye(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,o=n&&n.context;t.$slots=de(e._renderChildren,o),t.$scopedSlots=r,t._c=function(e,n,r,o){return Ne(t,e,n,r,o,!1)},t.$createElement=function(e,n,r,o){return Ne(t,e,n,r,o,!0)};var i=n&&n.data;Dt(t,"$attrs",i&&i.attrs||r,null,!0),Dt(t,"$listeners",e._parentListeners||r,null,!0)}(e),tn(e,"beforeCreate"),function(t){var e=pe(t.$options.inject,t);e&&(kt(!1),Object.keys(e).forEach((function(n){Dt(t,n,e[n])})),kt(!0))}(e),gn(e),function(t){var e=t.$options.provide;e&&(t._provided="function"==typeof e?e.call(t):e)}(e),tn(e,"created"),e.$options.el&&e.$mount(e.$options.el)}}(An),function(t){var e={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(t.prototype,"$data",e),Object.defineProperty(t.prototype,"$props",n),t.prototype.$set=Et,t.prototype.$delete=St,t.prototype.$watch=function(t,e,n){if(l(e))return xn(this,t,e,n);(n=n||{}).user=!0;var r=new dn(this,t,e,n);if(n.immediate){var o='callback for immediate watcher "'+r.expression+'"';pt(),Vt(e,this,[r.value],this,o),dt()}return function(){r.teardown()}}}(An),function(t){var e=/^hook:/;t.prototype.$on=function(t,n){var r=this;if(Array.isArray(t))for(var o=0,i=t.length;o1?S(n):n;for(var r=S(arguments,1),o='event handler for "'+t+'"',i=0,a=n.length;iparseInt(this.max)&&On(t,e[0],e,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)On(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){Sn(t,(function(t){return En(e,t)}))})),this.$watch("exclude",(function(e){Sn(t,(function(t){return!En(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=He(t),n=e&&e.componentOptions;if(n){var r=Dn(n),o=this.include,i=this.exclude;if(o&&(!r||!En(o,r))||i&&r&&En(i,r))return e;var a=this.cache,s=this.keys,u=null==e.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):e.key;a[u]?(e.componentInstance=a[u].componentInstance,y(s,u),s.push(u)):(this.vnodeToCache=e,this.keyToCache=u),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={get:function(){return B}};Object.defineProperty(t,"config",e),t.util={warn:ut,extend:O,mergeOptions:Rt,defineReactive:Dt},t.set=Et,t.delete=St,t.nextTick=ne,t.observable=function(t){return Ct(t),t},t.options=Object.create(null),M.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,O(t.options.components,jn),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=S(arguments,1);return n.unshift(this),"function"==typeof t.install?t.install.apply(t,n):"function"==typeof t&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=Rt(this.options,t),this}}(t),Cn(t),function(t){M.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&l(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&"function"==typeof n&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(An),Object.defineProperty(An.prototype,"$isServer",{get:rt}),Object.defineProperty(An.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(An,"FunctionalRenderContext",{value:Pe}),An.version="2.6.14";var Tn=g("style,class"),Fn=g("input,textarea,option,select,progress"),Pn=g("contenteditable,draggable,spellcheck"),In=g("events,caret,typing,plaintext-only"),Rn=g("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),Mn="http://www.w3.org/1999/xlink",Ln=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},Bn=function(t){return Ln(t)?t.slice(6,t.length):""},zn=function(t){return null==t||!1===t};function Nn(t){for(var e=t.data,n=t,r=t;i(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=Un(r.data,e));for(;i(n=n.parent);)n&&n.data&&(e=Un(e,n.data));return function(t,e){if(i(t)||i(e))return qn(t,Vn(e));return""}(e.staticClass,e.class)}function Un(t,e){return{staticClass:qn(t.staticClass,e.staticClass),class:i(t.class)?[t.class,e.class]:e.class}}function qn(t,e){return t?e?t+" "+e:t:e||""}function Vn(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,o=t.length;r-1?dr(t,e,n):Rn(e)?zn(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):Pn(e)?t.setAttribute(e,function(t,e){return zn(e)||"false"===e?"false":"contenteditable"===t&&In(e)?e:"true"}(e,n)):Ln(e)?zn(n)?t.removeAttributeNS(Mn,Bn(e)):t.setAttributeNS(Mn,e,n):dr(t,e,n)}function dr(t,e,n){if(zn(n))t.removeAttribute(e);else{if(Y&&!K&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var hr={create:fr,update:fr};function vr(t,e){var n=e.elm,r=e.data,a=t.data;if(!(o(r.staticClass)&&o(r.class)&&(o(a)||o(a.staticClass)&&o(a.class)))){var s=Nn(e),u=n._transitionClasses;i(u)&&(s=qn(s,Vn(u))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var gr,mr={create:vr,update:vr};function yr(t,e,n){var r=gr;return function o(){var i=e.apply(null,arguments);null!==i&&xr(t,o,n,r)}}var br=Qt&&!(X&&Number(X[1])<=53);function wr(t,e,n,r){if(br){var o=un,i=e;e=i._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return i.apply(this,arguments)}}gr.addEventListener(t,e,et?{capture:n,passive:r}:n)}function xr(t,e,n,r){(r||gr).removeEventListener(t,e._wrapper||e,n)}function _r(t,e){if(!o(t.data.on)||!o(e.data.on)){var n=e.data.on||{},r=t.data.on||{};gr=e.elm,function(t){if(i(t.__r)){var e=Y?"change":"input";t[e]=[].concat(t.__r,t[e]||[]),delete t.__r}i(t.__c)&&(t.change=[].concat(t.__c,t.change||[]),delete t.__c)}(n),se(n,r,wr,xr,yr,e.context),gr=void 0}}var kr,Ar={create:_r,update:_r};function Cr(t,e){if(!o(t.data.domProps)||!o(e.data.domProps)){var n,r,a=e.elm,s=t.data.domProps||{},u=e.data.domProps||{};for(n in i(u.__ob__)&&(u=e.data.domProps=O({},u)),s)n in u||(a[n]="");for(n in u){if(r=u[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),r===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=r;var c=o(r)?"":String(r);Dr(a,c)&&(a.value=c)}else if("innerHTML"===n&&Gn(a.tagName)&&o(a.innerHTML)){(kr=kr||document.createElement("div")).innerHTML="";for(var l=kr.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;l.firstChild;)a.appendChild(l.firstChild)}else if(r!==s[n])try{a[n]=r}catch(t){}}}}function Dr(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,r=t._vModifiers;if(i(r)){if(r.number)return v(n)!==v(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var Er={create:Cr,update:Cr},Sr=x((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}})),e}));function Or(t){var e=$r(t.style);return t.staticStyle?O(t.staticStyle,e):e}function $r(t){return Array.isArray(t)?$(t):"string"==typeof t?Sr(t):t}var jr,Tr=/^--/,Fr=/\s*!important$/,Pr=function(t,e,n){if(Tr.test(e))t.style.setProperty(e,n);else if(Fr.test(n))t.style.setProperty(D(e),n.replace(Fr,""),"important");else{var r=Rr(e);if(Array.isArray(n))for(var o=0,i=n.length;o-1?e.split(Br).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function Nr(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(Br).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" "+(t.getAttribute("class")||"")+" ",r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function Ur(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&O(e,qr(t.name||"v")),O(e,t),e}return"string"==typeof t?qr(t):void 0}}var qr=x((function(t){return{enterClass:t+"-enter",enterToClass:t+"-enter-to",enterActiveClass:t+"-enter-active",leaveClass:t+"-leave",leaveToClass:t+"-leave-to",leaveActiveClass:t+"-leave-active"}})),Vr=H&&!K,Hr="transition",Wr="transitionend",Gr="animation",Qr="animationend";Vr&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Hr="WebkitTransition",Wr="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Gr="WebkitAnimation",Qr="webkitAnimationEnd"));var Yr=H?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function Kr(t){Yr((function(){Yr(t)}))}function Jr(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),zr(t,e))}function Zr(t,e){t._transitionClasses&&y(t._transitionClasses,e),Nr(t,e)}function Xr(t,e,n){var r=eo(t,e),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s="transition"===o?Wr:Qr,u=0,c=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++u>=a&&c()};setTimeout((function(){u0&&(n="transition",l=a,f=i.length):"animation"===e?c>0&&(n="animation",l=c,f=u.length):f=(n=(l=Math.max(a,c))>0?a>c?"transition":"animation":null)?"transition"===n?i.length:u.length:0,{type:n,timeout:l,propCount:f,hasTransform:"transition"===n&&to.test(r[Hr+"Property"])}}function no(t,e){for(;t.length1}function uo(t,e){!0!==e.data.show&&oo(e)}var co=function(t){var e,n,r={},u=t.modules,c=t.nodeOps;for(e=0;eh?b(t,o(n[m+1])?null:n[m+1].elm,n,d,m,r):d>m&&x(e,p,h)}(p,g,m,n,l):i(m)?(i(t.text)&&c.setTextContent(p,""),b(p,null,m,0,m.length-1,n)):i(g)?x(g,0,g.length-1):i(t.text)&&c.setTextContent(p,""):t.text!==e.text&&c.setTextContent(p,e.text),i(h)&&i(d=h.hook)&&i(d=d.postpatch)&&d(t,e)}}}function C(t,e,n){if(a(n)&&i(t.parent))t.parent.data.pendingInsert=e;else for(var r=0;r-1,a.selected!==i&&(a.selected=i);else if(P(vo(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));o||(t.selectedIndex=-1)}}function ho(t,e){return e.every((function(e){return!P(e,t)}))}function vo(t){return"_value"in t?t._value:t.value}function go(t){t.target.composing=!0}function mo(t){t.target.composing&&(t.target.composing=!1,yo(t.target,"input"))}function yo(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function bo(t){return!t.componentInstance||t.data&&t.data.transition?t:bo(t.componentInstance._vnode)}var wo={model:lo,show:{bind:function(t,e,n){var r=e.value,o=(n=bo(n)).data&&n.data.transition,i=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&o?(n.data.show=!0,oo(n,(function(){t.style.display=i}))):t.style.display=r?i:"none"},update:function(t,e,n){var r=e.value;!r!=!e.oldValue&&((n=bo(n)).data&&n.data.transition?(n.data.show=!0,r?oo(n,(function(){t.style.display=t.__vOriginalDisplay})):io(n,(function(){t.style.display="none"}))):t.style.display=r?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,r,o){o||(t.style.display=t.__vOriginalDisplay)}}},xo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function _o(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?_o(He(e.children)):t}function ko(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var o=n._parentListeners;for(var i in o)e[k(i)]=o[i];return e}function Ao(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var Co=function(t){return t.tag||ve(t)},Do=function(t){return"show"===t.name},Eo={name:"transition",props:xo,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(Co)).length){0;var r=this.mode;0;var o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var i=_o(o);if(!i)return o;if(this._leaving)return Ao(t,o);var a="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?a+"comment":a+i.tag:s(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var u=(i.data||(i.data={})).transition=ko(this),c=this._vnode,l=_o(c);if(i.data.directives&&i.data.directives.some(Do)&&(i.data.show=!0),l&&l.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(i,l)&&!ve(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=O({},u);if("out-in"===r)return this._leaving=!0,ue(f,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),Ao(t,o);if("in-out"===r){if(ve(i))return c;var p,d=function(){p()};ue(u,"afterEnter",d),ue(u,"enterCancelled",d),ue(f,"delayLeave",(function(t){p=t}))}}return o}}},So=O({tag:String,moveClass:String},xo);function Oo(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function $o(t){t.data.newPos=t.elm.getBoundingClientRect()}function jo(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,o=e.top-n.top;if(r||o){t.data.moved=!0;var i=t.elm.style;i.transform=i.WebkitTransform="translate("+r+"px,"+o+"px)",i.transitionDuration="0s"}}delete So.mode;var To={Transition:Eo,TransitionGroup:{props:So,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var o=Je(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=ko(this),s=0;s-1?Yn[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Yn[t]=/HTMLUnknownElement/.test(e.toString())},O(An.options.directives,wo),O(An.options.components,To),An.prototype.__patch__=H?co:j,An.prototype.$mount=function(t,e){return function(t,e,n){var r;return t.$el=e,t.$options.render||(t.$options.render=gt),tn(t,"beforeMount"),r=function(){t._update(t._render(),n)},new dn(t,r,j,{before:function(){t._isMounted&&!t._isDestroyed&&tn(t,"beforeUpdate")}},!0),n=!1,null==t.$vnode&&(t._isMounted=!0,tn(t,"mounted")),t}(this,t=t&&H?function(t){if("string"==typeof t){var e=document.querySelector(t);return e||document.createElement("div")}return t}(t):void 0,e)},H&&setTimeout((function(){B.devtools&&ot&&ot.emit("init",An)}),0),e.default=An},function(t,e,n){var r=n(0),o=n(42).f,i=n(31),a=n(18),s=n(125),u=n(131),c=n(104);t.exports=function(t,e){var n,l,f,p,d,h=t.target,v=t.global,g=t.stat;if(n=v?r:g?r[h]||s(h,{}):(r[h]||{}).prototype)for(l in e){if(p=e[l],f=t.noTargetGet?(d=o(n,l))&&d.value:n[l],!c(v?l:h+(g?".":"#")+l,t.forced)&&void 0!==f){if(typeof p==typeof f)continue;u(p,f)}(t.sham||f&&f.sham)&&i(p,"sham",!0),a(n,l,p,t)}}},function(t,e,n){var r=n(69),o=Function.prototype,i=o.bind,a=o.call,s=r&&i.bind(a,a);t.exports=r?function(t){return t&&s(t)}:function(t){return t&&function(){return a.apply(t,arguments)}}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e){t.exports=function(t){return"function"==typeof t}},function(t,e,n){var r=n(0),o=n(52),i=n(11),a=n(97),s=n(53),u=n(171),c=o("wks"),l=r.Symbol,f=l&&l.for,p=u?l:l&&l.withoutSetter||a;t.exports=function(t){if(!i(c,t)||!s&&"string"!=typeof c[t]){var e="Symbol."+t;s&&i(l,t)?c[t]=l[t]:c[t]=u&&f?f(e):p(e)}return c[t]}},function(t,e,n){"use strict";n.d(e,"a",(function(){return f}));var r=n(1);
+/**
+ * vue-class-component v7.2.6
+ * (c) 2015-present Evan You
+ * @license MIT
+ */function o(t){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function i(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function a(t){return function(t){if(Array.isArray(t)){for(var e=0,n=new Array(t.length);e1&&void 0!==arguments[1]?arguments[1]:{};e.name=e.name||t._componentTag||t.name;var n=t.prototype;Object.getOwnPropertyNames(n).forEach((function(t){if("constructor"!==t)if(d.indexOf(t)>-1)e[t]=n[t];else{var r=Object.getOwnPropertyDescriptor(n,t);void 0!==r.value?"function"==typeof r.value?(e.methods||(e.methods={}))[t]=r.value:(e.mixins||(e.mixins=[])).push({data:function(){return i({},t,r.value)}}):(r.get||r.set)&&((e.computed||(e.computed={}))[t]={get:r.get,set:r.set})}})),(e.mixins||(e.mixins=[])).push({data:function(){return p(this,t)}});var o=t.__decorators__;o&&(o.forEach((function(t){return t(e)})),delete t.__decorators__);var a=Object.getPrototypeOf(t.prototype),c=a instanceof r.default?a.constructor:r.default,l=c.extend(e);return g(l,t,c),s()&&u(l,t),l}var v={prototype:!0,arguments:!0,callee:!0,caller:!0};function g(t,e,n){Object.getOwnPropertyNames(e).forEach((function(r){if(!v[r]){var i=Object.getOwnPropertyDescriptor(t,r);if(!i||i.configurable){var a,s,u=Object.getOwnPropertyDescriptor(e,r);if(!l){if("cid"===r)return;var c=Object.getOwnPropertyDescriptor(n,r);if(a=u.value,s=o(a),null!=a&&("object"===s||"function"===s)&&c&&c.value===u.value)return}0,Object.defineProperty(t,r,u)}}}))}function m(t){return"function"==typeof t?h(t):function(e){return h(e,t)}}m.registerHooks=function(t){d.push.apply(d,a(t))},e.b=m},function(t,e,n){var r=n(134),o=n(18),i=n(297);r||o(Object.prototype,"toString",i,{unsafe:!0})},function(t,e,n){var r=n(4);t.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(t,e,n){var r=n(69),o=Function.prototype.call;t.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},function(t,e,n){var r=n(3),o=n(20),i=r({}.hasOwnProperty);t.exports=Object.hasOwn||function(t,e){return i(o(t),e)}},function(t,e,n){var r=n(0),o=n(107),i=r.String;t.exports=function(t){if("Symbol"===o(t))throw TypeError("Cannot convert a Symbol value to a string");return i(t)}},function(t,e,n){var r=n(0),o=n(14),i=r.String,a=r.TypeError;t.exports=function(t){if(o(t))return t;throw a(i(t)+" is not an object")}},function(t,e,n){var r=n(5);t.exports=function(t){return"object"==typeof t?null!==t:r(t)}},function(t,e,n){"use strict";function r(t,e,n,r,o,i,a,s){var u,c="function"==typeof t?t.options:t;if(e&&(c.render=e,c.staticRenderFns=n,c._compiled=!0),r&&(c.functional=!0),i&&(c._scopeId="data-v-"+i),a?(u=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),o&&o.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(a)},c._ssrRegister=u):o&&(u=s?function(){o.call(this,(c.functional?this.parent:this).$root.$options.shadowRoot)}:o),u)if(c.functional){c._injectStyles=u;var l=c.render;c.render=function(t,e){return u.call(e),l(t,e)}}else{var f=c.beforeCreate;c.beforeCreate=f?[].concat(f,u):[u]}return{exports:t,options:c}}n.d(e,"a",(function(){return r}))},function(t,e,n){var r=n(0),o=n(9),i=n(173),a=n(172),s=n(13),u=n(99),c=r.TypeError,l=Object.defineProperty,f=Object.getOwnPropertyDescriptor;e.f=o?a?function(t,e,n){if(s(t),e=u(e),s(n),"function"==typeof t&&"prototype"===e&&"value"in n&&"writable"in n&&!n.writable){var r=f(t,e);r&&r.writable&&(t[e]=n.value,n={configurable:"configurable"in n?n.configurable:r.configurable,enumerable:"enumerable"in n?n.enumerable:r.enumerable,writable:!1})}return l(t,e,n)}:l:function(t,e,n){if(s(t),e=u(e),s(n),i)try{return l(t,e,n)}catch(t){}if("get"in n||"set"in n)throw c("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));n(92),n(84),n(28),n(8),n(265),n(82),n(83),n(196),n(429),n(93);var r=n(88);function o(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t){for(var e=1;e1?arguments[1]:void 0)}})},function(t,e,n){var r=n(3),o=r({}.toString),i=r("".slice);t.exports=function(t){return i(o(t),8,-1)}},function(t,e,n){var r=n(0),o=n(5),i=n(71),a=r.TypeError;t.exports=function(t){if(o(t))return t;throw a(i(t)+" is not a function")}},function(t,e,n){var r=n(9),o=n(16),i=n(57);t.exports=r?function(t,e,n){return o.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){t.exports=n(464)},function(t,e,n){var r=n(56);t.exports=function(t){return r(t.length)}},function(t,e,n){var r=n(3);t.exports=r({}.isPrototypeOf)},function(t,e,n){var r,o,i,a=n(276),s=n(0),u=n(3),c=n(14),l=n(31),f=n(11),p=n(124),d=n(101),h=n(72),v=s.TypeError,g=s.WeakMap;if(a||p.state){var m=p.state||(p.state=new g),y=u(m.get),b=u(m.has),w=u(m.set);r=function(t,e){if(b(m,t))throw new v("Object already initialized");return e.facade=t,w(m,t,e),e},o=function(t){return y(m,t)||{}},i=function(t){return b(m,t)}}else{var x=d("state");h[x]=!0,r=function(t,e){if(f(t,x))throw new v("Object already initialized");return e.facade=t,l(t,x,e),e},o=function(t){return f(t,x)?t[x]:{}},i=function(t){return f(t,x)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw v("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){"use strict";var r=n(193).charAt,o=n(12),i=n(35),a=n(176),s=i.set,u=i.getterFor("String Iterator");a(String,"String",(function(t){s(this,{type:"String Iterator",string:o(t),index:0})}),(function(){var t,e=u(this),n=e.string,o=e.index;return o>=n.length?{value:void 0,done:!0}:(t=r(n,o),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){var r=n(215),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();t.exports=i},function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){var r=n(0),o=n(194),i=n(195),a=n(169),s=n(31),u=n(6),c=u("iterator"),l=u("toStringTag"),f=a.values,p=function(t,e){if(t){if(t[c]!==f)try{s(t,c,f)}catch(e){t[c]=f}if(t[l]||s(t,l,e),o[e])for(var n in a)if(t[n]!==a[n])try{s(t,n,a[n])}catch(e){t[n]=a[n]}}};for(var d in o)p(r[d]&&r[d].prototype,d);p(i,"DOMTokenList")},function(t,e,n){var r=n(19);t.exports=r("navigator","userAgent")||""},function(t,e,n){var r,o=n(13),i=n(126),a=n(129),s=n(72),u=n(175),c=n(98),l=n(101),f=l("IE_PROTO"),p=function(){},d=function(t){return"
+
+
+
+
+
+
+
+
+
+
+
+