{"id":119700,"date":"2026-10-30T07:40:36","date_gmt":"2026-10-29T23:40:36","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/119700.html"},"modified":"2026-10-30T07:40:36","modified_gmt":"2026-10-29T23:40:36","slug":"%e8%ae%a9-buildroot-%e6%9c%8d%e5%8a%a1%e5%85%88%e5%ae%8c%e6%88%90-tcp-%e6%94%b6%e5%8f%91%ef%bc%8c%e5%86%8d%e5%a4%84%e7%90%86%e6%b6%88%e6%81%af%e8%be%b9%e7%95%8c%e3%80%81%e6%96%ad%e7%ba%bf%e4%b8%8e","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/119700.html","title":{"rendered":"\u8ba9 Buildroot \u670d\u52a1\u5148\u5b8c\u6210 TCP \u6536\u53d1\uff0c\u518d\u5904\u7406\u6d88\u606f\u8fb9\u754c\u3001\u65ad\u7ebf\u4e0e\u91cd\u8fde"},"content":{"rendered":"<h2>\u8ba9 Buildroot \u670d\u52a1\u5148\u5b8c\u6210 TCP \u6536\u53d1&#xff0c;\u518d\u5904\u7406\u6d88\u606f\u8fb9\u754c\u3001\u65ad\u7ebf\u4e0e\u91cd\u8fde<\/h2>\n<p>\u4e0a\u4e00\u7bc7\u4e3a debug-demo \u670d\u52a1\u521b\u5efa\u4e86\u4e13\u7528\u8d26\u6237&#xff0c;\u5e76\u5728 QEMU \u4e2d\u9a8c\u8bc1\u4e86\u964d\u6743\u540e\u7684\u670d\u52a1\u4ecd\u80fd\u5199\u65e5\u5fd7\u3001\u540c\u65f6\u65e0\u6cd5\u8bfb\u53d6 root-only \u6d4b\u8bd5\u6587\u4ef6\u3002\u8fd9\u7bc7\u6cbf\u7528\u540c\u4e00\u5957 Ubuntu\u3001Buildroot \u548c QEMU \u73af\u5883&#xff0c;\u8ba9\u8fd9\u4e2a\u524d\u53f0\u670d\u52a1\u518d\u589e\u52a0\u4e00\u9879\u80fd\u529b&#xff1a;\u8fde\u63a5 Ubuntu \u4e3b\u673a\u4e0a\u7684\u6d4b\u8bd5\u670d\u52a1&#xff0c;\u5468\u671f\u6027\u53d1\u9001\u4e00\u884c\u8bf7\u6c42\u5e76\u63a5\u6536\u4e00\u884c\u54cd\u5e94\u3002<\/p>\n<p>\u672c\u6587\u5148\u8ba9\u6700\u5c0f\u6536\u53d1\u94fe\u8def\u8dd1\u901a&#xff0c;\u518d\u8bf4\u660e\u4e3a\u4ec0\u4e48\u4e00\u6b21 send() \u4e0d\u7b49\u4e8e\u5bf9\u7aef\u4e00\u6b21 recv()&#xff0c;\u7136\u540e\u52a0\u5165\u6362\u884c\u5206\u5e27\u3001\u65ad\u7ebf\u68c0\u6d4b\u548c\u5e26\u9000\u907f\u7684\u91cd\u8fde\u3002\u7f51\u7edc\u8bf7\u6c42\u4ecd\u7531 debug-demo \u975e\u7279\u6743\u8d26\u6237\u53d1\u8d77&#xff1b;BusyBox init \u7ee7\u7eed\u8d1f\u8d23\u76d1\u7763\u8fdb\u7a0b\u3002<\/p>\n<h3>\u4e00\u3001\u8fd9\u6b21\u8981\u5b8c\u6210\u4ec0\u4e48<\/h3>\n<p>\u672c\u7bc7\u4e0d\u5b9e\u73b0\u4e00\u4e2a\u901a\u7528\u7f51\u7edc\u534f\u8bae\u6808&#xff0c;\u53ea\u5efa\u7acb\u4e00\u4e2a\u5bb9\u6613\u89c2\u5bdf\u7684 TCP \u5ba2\u6237\u7aef\u5b9e\u9a8c&#xff1a;<\/p>\n<p>Ubuntu \u4e3b\u673a\u4e0a\u7684 Python \u6d4b\u8bd5\u670d\u52a1<br \/>\n          ^  TCP&#xff1a;\u4e00\u884c\u8bf7\u6c42 \/ \u4e00\u884c\u54cd\u5e94<br \/>\n          |<br \/>\nQEMU ARM64 \u4e2d\u7684 debug-demo \u5ba2\u6237\u7aef<br \/>\n          |<br \/>\nBusyBox init \u4ee5 respawn \u65b9\u5f0f\u76d1\u7763<\/p>\n<p>\u672c\u6b21\u5b9e\u9645\u9a8c\u8bc1\u4e09\u6761\u4e3b\u7ebf&#xff1a;<\/p>\n<li>QEMU \u4e2d\u7684\u7a0b\u5e8f\u80fd\u8fde\u63a5\u4e3b\u673a\u5e76\u5b8c\u6210\u8bf7\u6c42\/\u54cd\u5e94\u3002<\/li>\n<li>\u4e3b\u673a\u670d\u52a1\u505c\u6b62\u540e&#xff0c;\u5ba2\u6237\u7aef\u6301\u7eed\u91cd\u8bd5&#xff1b;\u4e3b\u673a\u670d\u52a1\u6062\u590d\u540e&#xff0c;\u5ba2\u6237\u7aef\u81ea\u52a8\u91cd\u8fde\u5e76\u6062\u590d\u6536\u53d1\u3002<\/li>\n<li>\u5ba2\u6237\u7aef\u8fdb\u7a0b\u9000\u51fa\u540e&#xff0c;BusyBox init \u81ea\u52a8\u542f\u52a8\u65b0\u8fdb\u7a0b&#xff0c;\u65b0\u8fdb\u7a0b\u964d\u6743\u540e\u6062\u590d\u6536\u53d1\u3002<\/li>\n<p>\u6362\u884c\u5206\u5e27\u3001\u77ed\u5199\u5904\u7406\u548c 1\u30012\u30014\u30018 \u79d2\u9000\u907f\u4f1a\u7ed3\u5408\u4ee3\u7801\u8bf4\u660e&#xff1b;\u666e\u901a\u6536\u53d1\u65e5\u5fd7\u4e0d\u7b49\u4e8e\u8fd9\u4e9b\u673a\u5236\u7684\u5168\u90e8\u8fb9\u754c\u60c5\u51b5\u90fd\u5df2\u7ecf\u8fc7\u6d4b\u8bd5\u3002\u5177\u4f53\u5df2\u9a8c\u8bc1\u548c\u672a\u9a8c\u8bc1\u8303\u56f4\u89c1\u6587\u672b\u3002<\/p>\n<p>\u672c\u4f8b\u7684\u6d88\u606f\u683c\u5f0f\u662f\u6559\u5b66\u7528\u7684 ASCII \u6587\u672c\u884c&#xff0c;\u4f8b\u5982 tick&#061;3\\\\n\u3002\u5b83\u4e0d\u662f\u751f\u4ea7\u73af\u5883\u534f\u8bae&#xff0c;\u6ca1\u6709\u8ba4\u8bc1\u3001\u52a0\u5bc6\u3001\u6d88\u606f\u53bb\u91cd\u6216\u4e1a\u52a1\u7ea7\u786e\u8ba4\u673a\u5236\u3002<\/p>\n<h3>\u4e8c\u3001\u73af\u5883\u4e0e\u64cd\u4f5c\u7ea6\u5b9a<\/h3>\n<table>\n<tr>\u9879\u76ee\u672c\u6587\u6cbf\u7528\u7684\u8bbe\u7f6e<\/tr>\n<tbody>\n<tr>\n<td>\u5f00\u53d1\u4e3b\u673a<\/td>\n<td>Ubuntu 20.04 x86_64 \u865a\u62df\u673a<\/td>\n<\/tr>\n<tr>\n<td>Buildroot<\/td>\n<td>2025.02.8&#xff0c;~\/buildroot-2025.02.8<\/td>\n<\/tr>\n<tr>\n<td>\u8f93\u51fa\u76ee\u5f55<\/td>\n<td>~\/buildroot-output-arm64-demo<\/td>\n<\/tr>\n<tr>\n<td>\u5916\u90e8\u76ee\u5f55<\/td>\n<td>~\/buildroot-external-demo&#xff0c;\u6807\u8bc6 ARM64_DEMO<\/td>\n<\/tr>\n<tr>\n<td>\u76ee\u6807\u7cfb\u7edf<\/td>\n<td>QEMU ARM64&#xff0c;BusyBox init<\/td>\n<\/tr>\n<tr>\n<td>\u670d\u52a1\u7a0b\u5e8f<\/td>\n<td>\/usr\/bin\/debug_demo &#8211;service<\/td>\n<\/tr>\n<tr>\n<td>TCP \u670d\u52a1\u7aef<\/td>\n<td>Ubuntu \u4e3b\u673a&#xff0c;TCP 5000 \u7aef\u53e3<\/td>\n<\/tr>\n<tr>\n<td>QEMU user-mode \u4e3b\u673a\u5730\u5740<\/td>\n<td>10.0.2.2<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u9ed8\u8ba4\u547d\u4ee4\u5728 Ubuntu \u4e3b\u673a\u6267\u884c&#xff1b;\u6807\u6ce8 QEMU \u76ee\u6807\u7aef\u7684\u547d\u4ee4\u624d\u5728 ARM64 \u7cfb\u7edf\u5185\u6267\u884c\u3002\u4e0d\u8981\u5728 Windows PowerShell \u6267\u884c\u672c\u6587\u7684 Bash \u547d\u4ee4\u3002<\/p>\n<p>\u672c\u6587\u4f9d\u8d56\u524d\u6587\u5df2\u7ecf\u914d\u7f6e\u7684\u670d\u52a1\u8d26\u6237\u3001\u65e5\u5fd7\u76ee\u5f55\u6743\u9650\u3001\u542f\u52a8\u51c6\u5907\u811a\u672c\u548c init \u670d\u52a1\u9879&#xff0c;\u4e0d\u662f\u4ece\u7a7a\u767d Buildroot \u73af\u5883\u5f00\u59cb\u7684\u72ec\u7acb\u6559\u7a0b\u3002<\/p>\n<p>\u4ee3\u7801\u4e0e\u5b9e\u6d4b\u7248\u672c\u8bf4\u660e&#xff1a; \u672c\u6b21\u5ba1\u6821\u8865\u5145\u4e86 C \u5ba2\u6237\u7aef\u7684\u65e5\u5fd7\u5931\u8d25\u5904\u7406\u548c Python \u670d\u52a1\u7684\u8fde\u63a5\u5f02\u5e38\u5904\u7406\u3002\u7b2c\u516b\u3001\u4e5d\u8282\u53ea\u8bb0\u5f55\u672c\u8f6e\u4fee\u8ba2\u7248\u5b9e\u9a8c&#xff1b;\u672c\u8f6e\u670d\u52a1\u5148\u7531 PID 121 \u8fd0\u884c&#xff0c;\u968f\u540e\u7531 init \u62c9\u8d77 PID 133\u3002\u6784\u5efa\u9000\u51fa\u7801\u548c\u65e5\u5fd7\u5f02\u5e38\u5206\u652f\u72b6\u6001\u89c1\u6587\u672b\u3002<\/p>\n<p>QEMU \u7684 -netdev user \u4e3a\u865a\u62df\u673a\u63d0\u4f9b user-mode \u7f51\u7edc\u3002\u8be5\u914d\u7f6e\u4e0b&#xff0c;guest \u901a\u5e38\u901a\u8fc7 10.0.2.2 \u8bbf\u95ee\u5bbf\u4e3b\u673a\u3002\u82e5\u4f60\u7684 QEMU \u7f51\u7edc\u914d\u7f6e\u4e0d\u540c&#xff0c;\u5e94\u6309\u5b9e\u9645\u7f51\u5173\u8c03\u6574\u7a0b\u5e8f\u4e2d\u7684 SERVER_HOST\u3002\u4e3b\u673a\u6d4b\u8bd5\u670d\u52a1\u4f1a\u7ed1\u5b9a 0.0.0.0 \u4ee5\u63a5\u53d7\u6765\u81ea QEMU \u7684\u8fde\u63a5&#xff1b;\u5b9e\u9a8c\u65f6\u53ea\u5728\u53ef\u4fe1\u73af\u5883\u4e2d\u77ed\u65f6\u8fd0\u884c&#xff0c;\u5e76\u68c0\u67e5\u4e3b\u673a\u9632\u706b\u5899&#xff0c;\u4e0d\u8981\u628a\u8c03\u8bd5\u670d\u52a1\u957f\u671f\u66b4\u9732\u5230\u4e0d\u53ef\u4fe1\u7f51\u7edc\u3002<\/p>\n<h3>\u4e09\u3001\u5148\u786e\u8ba4\u670d\u52a1\u4ecd\u7531 init \u7ba1\u7406<\/h3>\n<p>\u5982\u679c QEMU \u4ecd\u5728\u8fd0\u884c&#xff0c;\u5148\u5728 QEMU \u76ee\u6807\u7aef\u6267\u884c&#xff1a;<\/p>\n<p>poweroff<\/p>\n<p>\u786e\u8ba4 QEMU \u8fdb\u7a0b\u9000\u51fa\u540e&#xff0c;\u518d\u5728 Ubuntu \u4e3b\u673a\u68c0\u67e5\u73b0\u6709\u914d\u7f6e\u548c\u6e90\u7801&#xff1a;<\/p>\n<p><span class=\"token builtin class-name\">export<\/span> <span class=\"token assign-left variable\">DEMO_OUT<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token environment constant\">$HOME<\/span>\/buildroot-output-arm64-demo&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">test<\/span> <span class=\"token parameter variable\">-f<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$DEMO_OUT<\/span>\/.config&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">printf<\/span> <span class=\"token string\">&#039;config check exit code: %s\\\\n&#039;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$?<\/span>&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">test<\/span> <span class=\"token parameter variable\">-f<\/span> <span class=\"token string\">&#034;<span class=\"token environment constant\">$HOME<\/span>\/buildroot-external-demo\/src\/debug-demo\/debug_demo.c&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">printf<\/span> <span class=\"token string\">&#039;source check exit code: %s\\\\n&#039;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$?<\/span>&#034;<\/span><br \/>\n<span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-nFx<\/span> <span class=\"token string\">&#039;::respawn:\/usr\/bin\/debug_demo &#8211;service&#039;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token string\">&#034;<span class=\"token environment constant\">$HOME<\/span>\/buildroot-external-demo\/board\/qemu-arm64-demo\/rootfs-overlay\/etc\/inittab&#034;<\/span><br \/>\n<span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-E<\/span> <span class=\"token string\">&#039;^BR2_(INIT_BUSYBOX|PACKAGE_DEBUG_DEMO)&#061;&#039;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$DEMO_OUT<\/span>\/.config&#034;<\/span><\/p>\n<p>\u4e24\u4e2a\u6587\u4ef6\u68c0\u67e5\u7684\u9000\u51fa\u7801\u90fd\u5e94\u4e3a 0&#xff1b;\u975e\u96f6\u65f6\u5148\u68c0\u67e5\u8def\u5f84&#xff0c;\u4e0d\u8981\u7ee7\u7eed\u8986\u76d6\u6e90\u7801\u3002\u8fd8\u5e94\u786e\u8ba4 debug-demo \u5df2\u542f\u7528&#xff0c;\u4e14 overlay \u4e2d\u4ecd\u53ea\u6709\u9884\u671f\u7684 respawn \u670d\u52a1\u9879\u3002\u672c\u6587\u4e0d\u589e\u52a0\u7b2c\u4e8c\u6761\u542f\u52a8\u8def\u5f84&#xff0c;\u4e0d\u624b\u5de5\u5728 shell \u4e2d\u542f\u52a8\u53e6\u4e00\u4e2a &#8211;service \u5b9e\u4f8b\u3002<\/p>\n<p>\u6b64\u524d Ubuntu \u4e3b\u673a\u914d\u7f6e\u68c0\u67e5\u7684\u5b9e\u9645\u8f93\u51fa\u8282\u9009\u5982\u4e0b&#xff08;\u5df2\u79fb\u9664\u63d0\u793a\u7b26\u4e2d\u7684\u7528\u6237\u540d\u548c\u4e3b\u673a\u540d&#xff0c;\u547d\u4ee4\u7ed3\u679c\u672a\u6539\u52a8&#xff09;&#xff1a;<\/p>\n<p>$ grep -nFx &#039;::respawn:\/usr\/bin\/debug_demo &#8211;service&#039; \\\\<br \/>\n&gt;   &#034;$HOME\/buildroot-external-demo\/board\/qemu-arm64-demo\/rootfs-overlay\/etc\/inittab&#034;<br \/>\n42:::respawn:\/usr\/bin\/debug_demo &#8211;service<br \/>\n$ grep -E &#039;^BR2_(INIT_BUSYBOX|PACKAGE_DEBUG_DEMO)&#061;&#039; &#034;$DEMO_OUT\/.config&#034;<br \/>\nBR2_INIT_BUSYBOX&#061;y<br \/>\nBR2_PACKAGE_DEBUG_DEMO&#061;y<\/p>\n<p>overlay \u4e2d\u7684\u670d\u52a1\u9879\u4f4d\u4e8e\u7b2c 42 \u884c&#xff0c;BusyBox init \u548c debug-demo \u5305\u5747\u5df2\u542f\u7528\u3002\u6b64\u524d\u4e24\u4e2a test -f \u7684\u9000\u51fa\u7801\u672a\u8bb0\u5f55&#xff0c;\u4e0d\u80fd\u4ec5\u51ed\u6ca1\u6709\u8f93\u51fa\u5224\u65ad\u6210\u529f&#xff1b;\u4e0a\u9762\u7684\u64cd\u4f5c\u547d\u4ee4\u5df2\u8865\u5145\u5373\u65f6\u663e\u793a\u9000\u51fa\u7801\u3002<\/p>\n<p>\u5728\u4fee\u6539\u6e90\u7801\u524d\u505a\u4e00\u4efd\u5907\u4efd&#xff1a;<\/p>\n<p><span class=\"token builtin class-name\">export<\/span> <span class=\"token assign-left variable\">TCP_BACKUP<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token environment constant\">$HOME<\/span>\/debug-demo-before-tcp-<span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d-%H%M%S<span class=\"token variable\">)<\/span><\/span>&#034;<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$TCP_BACKUP<\/span>&#034;<\/span><br \/>\n<span class=\"token function\">cp<\/span> <span class=\"token parameter variable\">-p<\/span> <span class=\"token string\">&#034;<span class=\"token environment constant\">$HOME<\/span>\/buildroot-external-demo\/src\/debug-demo\/debug_demo.c&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token string\">&#034;<span class=\"token variable\">$TCP_BACKUP<\/span>\/debug_demo.c&#034;<\/span><br \/>\n<span class=\"token function\">cp<\/span> <span class=\"token parameter variable\">-p<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$DEMO_OUT<\/span>\/.config&#034;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$TCP_BACKUP<\/span>\/buildroot.config&#034;<\/span><br \/>\n<span class=\"token builtin class-name\">printf<\/span> <span class=\"token string\">&#039;Backup: %s\\\\n&#039;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$TCP_BACKUP<\/span>&#034;<\/span><\/p>\n<h3>\u56db\u3001\u51c6\u5907 Ubuntu \u4e3b\u673a\u6d4b\u8bd5\u670d\u52a1<\/h3>\n<p>\u6d4b\u8bd5\u670d\u52a1\u53ea\u4f7f\u7528 Python 3 \u6807\u51c6\u5e93&#xff0c;\u4e0d\u9700\u8981\u5b89\u88c5\u7b2c\u4e09\u65b9\u5305\u3002\u5728 Ubuntu \u4e3b\u673a\u7ec8\u7aef A \u6267\u884c\u4e0b\u9762\u547d\u4ee4\u3002\u8fd9\u4e2a\u7ec8\u7aef\u4e13\u95e8\u8fd0\u884c\u6d4b\u8bd5\u670d\u52a1&#xff0c;\u540e\u7eed\u7f16\u8bd1\u548c\u542f\u52a8 QEMU \u4f7f\u7528\u53e6\u4e00\u4e2a\u7ec8\u7aef&#xff1a;<\/p>\n<p>python3 &#8211; <span class=\"token operator\">&lt;&lt;<\/span><span class=\"token string\">&#039;PY&#039;<br \/>\nimport socket<\/p>\n<p>HOST &#061; &#034;0.0.0.0&#034;<br \/>\nPORT &#061; 5000<br \/>\nMAX_LINE &#061; 256<\/p>\n<p>with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:<br \/>\n    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)<br \/>\n    server.bind((HOST, PORT))<br \/>\n    server.listen(4)<br \/>\n    print(f&#034;test server listening on {HOST}:{PORT}&#034;, flush&#061;True)<\/p>\n<p>    while True:<br \/>\n        connection, address &#061; server.accept()<br \/>\n        print(f&#034;accepted {address}&#034;, flush&#061;True)<br \/>\n        try:<br \/>\n            with connection:<br \/>\n                pending &#061; bytearray()<br \/>\n                while True:<br \/>\n                    chunk &#061; connection.recv(128)<br \/>\n                    if not chunk:<br \/>\n                        print(f&#034;peer closed {address}&#034;, flush&#061;True)<br \/>\n                        break<\/p>\n<p>                    pending.extend(chunk)<br \/>\n                    if len(pending) &gt; MAX_LINE and b&#034;\\\\n&#034; not in pending:<br \/>\n                        print(&#034;frame too long; closing connection&#034;, flush&#061;True)<br \/>\n                        break<\/p>\n<p>                    too_long &#061; False<br \/>\n                    while b&#034;\\\\n&#034; in pending:<br \/>\n                        line, _, remainder &#061; pending.partition(b&#034;\\\\n&#034;)<br \/>\n                        pending &#061; bytearray(remainder)<br \/>\n                        if len(line) &gt; MAX_LINE:<br \/>\n                            print(&#034;frame too long; closing connection&#034;, flush&#061;True)<br \/>\n                            too_long &#061; True<br \/>\n                            break<br \/>\n                        response &#061; b&#034;ACK &#034; &#043; line &#043; b&#034;\\\\n&#034;<br \/>\n                        connection.sendall(response)<br \/>\n                        print(f&#034;received&#061;{line!r} sent&#061;{response!r}&#034;, flush&#061;True)<br \/>\n                    if too_long:<br \/>\n                        break<br \/>\n        except OSError as error:<br \/>\n            print(f&#034;connection error {address}: {error}; accepting next peer&#034;, flush&#061;True)<br \/>\nPY<\/span><\/p>\n<p>\u8f93\u5165\u6700\u540e\u4e00\u884c PY \u5e76\u56de\u8f66\u540e&#xff0c;\u672c\u6b21\u5b9e\u9645\u770b\u5230\u7684\u542f\u52a8\u8f93\u51fa\u662f&#xff1a;<\/p>\n<p>test server listening on 0.0.0.0:5000<\/p>\n<p>\u6b64\u65f6\u7ec8\u7aef\u4e0d\u518d\u663e\u793a shell \u547d\u4ee4\u63d0\u793a\u7b26\u3001\u4e5f\u6682\u65f6\u6ca1\u6709\u65b0\u8f93\u51fa&#xff0c;\u90fd\u662f\u6b63\u5e38\u73b0\u8c61&#xff0c;\u4e0d\u662f\u7a0b\u5e8f\u5361\u6b7b\u3002 Python \u670d\u52a1\u6b63\u5728\u524d\u53f0\u8fd0\u884c&#xff0c;\u7b49\u5f85\u5ba2\u6237\u7aef\u8fde\u63a5&#xff1b;\u5efa\u7acb\u8fde\u63a5\u540e&#xff0c;\u5b83\u8fd8\u4f1a\u7b49\u5f85\u5ba2\u6237\u7aef\u53d1\u9001\u6570\u636e\u3002\u4e0d\u8981\u5728\u8fd9\u4e2a\u7ec8\u7aef\u7ee7\u7eed\u8f93\u5165\u540e\u7eed\u7684 Bash \u547d\u4ee4&#xff0c;\u4e5f\u4e0d\u8981\u4e3a\u4e86\u53d6\u56de\u63d0\u793a\u7b26\u800c\u6309 Ctrl&#043;C&#xff0c;\u5426\u5219\u4f1a\u505c\u6b62\u6d4b\u8bd5\u670d\u52a1\u3002<\/p>\n<p>\u4fdd\u6301\u7ec8\u7aef A \u5f00\u7740&#xff0c;\u53e6\u5f00\u4e00\u4e2a Ubuntu \u4e3b\u673a\u7ec8\u7aef B&#xff0c;\u7ee7\u7eed\u7b2c\u516d\u8282\u7684\u6e90\u7801\u66f4\u65b0\u3001\u7b2c\u4e03\u8282\u7684\u6784\u5efa\u548c\u7b2c\u516b\u8282\u7684 QEMU \u542f\u52a8\u3002\u65b0\u7ec8\u7aef\u4e0d\u81ea\u52a8\u7ee7\u627f\u7ec8\u7aef A \u4e2d\u8bbe\u7f6e\u7684\u53d8\u91cf&#xff1b;\u7b2c\u4e03\u3001\u516b\u8282\u4f1a\u91cd\u65b0\u8bbe\u7f6e\u6240\u9700\u7684 DEMO_OUT\u3002<\/p>\n<p>\u4e0a\u9762\u7684\u8f93\u51fa\u53ea\u8bc1\u660e\u4e3b\u673a\u670d\u52a1\u5df2\u5f00\u59cb\u76d1\u542c&#xff0c;\u4e0d\u4ee3\u8868 QEMU \u5ba2\u6237\u7aef\u5df2\u7ecf\u8fde\u63a5\u6216 TCP \u6536\u53d1\u5df2\u7ecf\u9a8c\u8bc1\u6210\u529f\u3002\u7b49\u65b0\u5ba2\u6237\u7aef\u542f\u52a8\u5e76\u8fde\u63a5\u540e&#xff0c;\u7ec8\u7aef A \u624d\u4f1a\u51fa\u73b0 accepted &#8230;&#xff1b;\u6536\u5230\u5b8c\u6574\u8bf7\u6c42\u5e76\u53d1\u9001\u54cd\u5e94\u540e&#xff0c;\u624d\u4f1a\u51fa\u73b0 received&#061;&#8230; sent&#061;&#8230;\u3002\u672c\u8f6e\u4e3b\u673a\u7aef\u548c\u76ee\u6807\u7aef\u6536\u53d1\u5b9e\u6d4b\u89c1\u7b2c\u4e5d\u8282\u3002<\/p>\n<p>\u670d\u52a1\u6309 \\\\n \u5206\u5272\u6536\u5230\u7684\u5b57\u8282\u6d41&#xff0c;\u518d\u4e3a\u6bcf\u4e00\u884c\u8fd4\u56de ACK  \u524d\u7f00\u3002\u5b83\u628a recv() \u6536\u5230\u7684\u4efb\u610f\u7247\u6bb5\u5148\u653e\u8fdb\u7f13\u51b2\u533a&#xff0c;\u6240\u4ee5\u8bf7\u6c42\u5373\u4f7f\u5206\u6210\u591a\u6b21\u5230\u8fbe&#xff0c;\u4e5f\u4f1a\u7b49\u5230\u5b8c\u6574\u884c\u518d\u5904\u7406\u3002sendall() \u5219\u8d1f\u8d23\u628a\u54cd\u5e94\u5b57\u8282\u5168\u90e8\u4ea4\u7ed9 socket \u5c42\u53d1\u9001\u3002<\/p>\n<p>\u8fde\u63a5\u5904\u7406\u4e2d\u7684 OSError&#xff08;\u5982\u8fde\u63a5\u91cd\u7f6e\u3001\u53d1\u9001\u65ad\u7ba1&#xff09;\u4f1a\u88ab\u8bb0\u5f55&#xff0c;\u5f53\u524d\u8fde\u63a5\u5173\u95ed\u540e\u7ee7\u7eed\u63a5\u53d7\u65b0\u8fde\u63a5&#xff1b;Ctrl&#043;C \u5f15\u53d1\u7684 KeyboardInterrupt \u4e0d\u4f1a\u88ab\u8fd9\u4e00\u5904\u7406\u6355\u83b7&#xff0c;\u4ecd\u53ef\u505c\u6b62\u6574\u4e2a\u670d\u52a1\u3002\u76d1\u542c\u7aef\u53e3\u7ed1\u5b9a\u7b49\u542f\u52a8\u9519\u8bef\u4ecd\u76f4\u63a5\u62a5\u9519\u9000\u51fa\u3002\u8be5\u670d\u52a1\u4e00\u6b21\u53ea\u5904\u7406\u4e00\u4e2a\u8fde\u63a5&#xff0c;\u6ca1\u6709\u5e76\u53d1\u548c\u8fde\u63a5\u7a7a\u95f2\u8d85\u65f6&#xff0c;\u7a7a\u95f2\u5ba2\u6237\u7aef\u53ef\u80fd\u963b\u585e\u5176\u4ed6\u5ba2\u6237\u7aef&#xff0c;\u56e0\u6b64\u4ec5\u7528\u4e8e\u672c\u5b9e\u9a8c\u3002<\/p>\n<p>\u5982\u679c\u63d0\u793a\u7aef\u53e3 5000 \u5df2\u88ab\u5360\u7528&#xff0c;\u5148\u68c0\u67e5\u662f\u5426\u5df2\u5728\u53e6\u4e00\u4e2a\u7ec8\u7aef\u8fd0\u884c\u4e86\u672c\u8282\u670d\u52a1&#xff1b;\u82e5\u5df2\u8fd0\u884c&#xff0c;\u76f4\u63a5\u4f7f\u7528\u5b83&#xff0c;\u4e0d\u8981\u518d\u542f\u52a8\u7b2c\u4e8c\u4efd\u3002\u82e5\u7aef\u53e3\u88ab\u5176\u4ed6\u9700\u8981\u4fdd\u7559\u7684\u7a0b\u5e8f\u5360\u7528&#xff0c;\u518d\u628a\u672c\u6587\u4e3b\u673a\u7aef\u548c\u5ba2\u6237\u7aef\u4e2d\u7684\u7aef\u53e3\u4e00\u5e76\u6539\u6210\u53e6\u4e00\u4e2a\u672a\u4f7f\u7528\u7aef\u53e3\u3002\u4ec5\u5728\u7b2c\u4e5d\u8282\u4e3b\u52a8\u6d4b\u8bd5\u65ad\u7ebf\u6216\u5b9e\u9a8c\u7ed3\u675f\u65f6&#xff0c;\u56de\u5230\u7ec8\u7aef A \u6309 Ctrl&#043;C \u505c\u6b62\u670d\u52a1\u3002<\/p>\n<h3>\u4e94\u3001\u5148\u7406\u89e3\u6700\u5c0f\u6536\u53d1&#xff0c;\u518d\u770b\u8fb9\u754c<\/h3>\n<p>TCP \u63d0\u4f9b\u7684\u662f\u6709\u5e8f\u5b57\u8282\u6d41&#xff0c;\u4e0d\u63d0\u4f9b\u5e94\u7528\u5c42\u6d88\u606f\u8fb9\u754c\u3002\u4e0b\u9762\u8fd9\u79cd\u4ee3\u7801\u53ea\u9002\u5408\u8bf4\u660e socket \u8c03\u7528\u5173\u7cfb&#xff0c;\u4e0d\u662f\u6700\u7ec8\u5b9e\u73b0&#xff1a;<\/p>\n<p><span class=\"token function\">send<\/span><span class=\"token punctuation\">(<\/span>socket_fd<span class=\"token punctuation\">,<\/span> request<span class=\"token punctuation\">,<\/span> request_length<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nreceived <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">recv<\/span><span class=\"token punctuation\">(<\/span>socket_fd<span class=\"token punctuation\">,<\/span> response<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>response<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>send() \u53ef\u80fd\u53ea\u53d1\u9001\u4e00\u90e8\u5206\u6570\u636e&#xff1b;recv() \u53ef\u80fd\u53ea\u8fd4\u56de\u5f53\u524d\u5df2\u5230\u8fbe\u7684\u4e00\u90e8\u5206&#xff0c;\u4e5f\u53ef\u80fd\u4e00\u6b21\u62ff\u5230\u591a\u6761\u5e94\u7528\u6d88\u606f\u3002\u8fd4\u56de\u503c\u662f\u5b57\u8282\u6570&#xff0c;\u4e0d\u662f\u201c\u6d88\u606f\u6570\u201d\u3002\u56e0\u6b64\u4ee3\u7801\u5fc5\u987b\u68c0\u67e5\u8fd4\u56de\u503c&#xff0c;\u5e76\u7531\u5e94\u7528\u534f\u8bae\u5b9a\u4e49\u5982\u4f55\u77e5\u9053\u4e00\u6761\u6d88\u606f\u5728\u54ea\u91cc\u7ed3\u675f\u3002<\/p>\n<p>\u672c\u7bc7\u4f7f\u7528\u6700\u7b80\u5355\u7684\u6587\u672c\u884c\u534f\u8bae&#xff1a;\u8bf7\u6c42\u548c\u54cd\u5e94\u90fd\u4ee5\u6362\u884c\u7b26 \\\\n \u7ed3\u5c3e\u3002\u7a0d\u540e\u7684 send_all() \u5faa\u73af\u5904\u7406\u77ed\u5199&#xff0c;receive_line() \u6301\u7eed\u8bfb\u53d6\u5230\u6362\u884c\u7b26\u624d\u8fd4\u56de\u4e00\u6761\u5b8c\u6574\u54cd\u5e94\u3002\u6559\u5b66\u5b9e\u73b0\u9010\u5b57\u8282\u8c03\u7528 recv()&#xff0c;\u4fbf\u4e8e\u770b\u6e05\u8fb9\u754c&#xff1b;\u4f4e\u5ef6\u8fdf\u6216\u9ad8\u541e\u5410\u4ea7\u54c1\u5e94\u4f7f\u7528\u7f13\u51b2\u533a\u89e3\u6790\u5668&#xff0c;\u907f\u514d\u6bcf\u4e2a\u5b57\u8282\u90fd\u89e6\u53d1\u4e00\u6b21\u7cfb\u7edf\u8c03\u7528\u3002<\/p>\n<h3>\u516d\u3001\u66f4\u65b0\u670d\u52a1\u5ba2\u6237\u7aef<\/h3>\n<p>\u5ba2\u6237\u7aef\u4f7f\u7528 QEMU user-mode \u7f51\u7edc\u4e2d\u7684\u4e3b\u673a\u5730\u5740 10.0.2.2 \u548c\u7aef\u53e3 5000\u3002\u7a0b\u5e8f\u4ecd\u7136\u5148\u67e5\u8be2\u670d\u52a1\u8d26\u6237\u3001\u6e05\u7a7a\u9644\u52a0\u7ec4\u5e76\u5207\u6362 UID\/GID&#xff0c;\u518d\u6253\u5f00 \/var\/log\/debug-demo\/debug-demo.log\u3002\u7f51\u7edc\u9519\u8bef\u548c\u91cd\u8fde\u4e8b\u4ef6\u5199\u5165\u540c\u4e00\u65e5\u5fd7\u3002<\/p>\n<p>\u5728 Ubuntu \u4e3b\u673a\u7ec8\u7aef B \u6267\u884c\u4e0b\u9762\u7684\u5b8c\u6574\u547d\u4ee4&#xff0c;\u66ff\u6362 src\/debug-demo\/debug_demo.c&#xff1b;\u7ec8\u7aef A \u4e2d\u7684 Python \u670d\u52a1\u7ee7\u7eed\u8fd0\u884c&#xff1a;<\/p>\n<p><span class=\"token builtin class-name\">cd<\/span> ~\/buildroot-external-demo <span class=\"token operator\">||<\/span> <span class=\"token builtin class-name\">exit<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token function\">cat<\/span> <span class=\"token operator\">&gt;<\/span> src\/debug-demo\/debug_demo.c <span class=\"token operator\">&lt;&lt;<\/span><span class=\"token string\">&#039;EOF&#039;<br \/>\n#define _DEFAULT_SOURCE<br \/>\n#define _POSIX_C_SOURCE 200809L<\/p>\n<p>#include &lt;errno.h&gt;<br \/>\n#include &lt;grp.h&gt;<br \/>\n#include &lt;netdb.h&gt;<br \/>\n#include &lt;pwd.h&gt;<br \/>\n#include &lt;signal.h&gt;<br \/>\n#include &lt;stdarg.h&gt;<br \/>\n#include &lt;stdio.h&gt;<br \/>\n#include &lt;stdlib.h&gt;<br \/>\n#include &lt;string.h&gt;<br \/>\n#include &lt;sys\/socket.h&gt;<br \/>\n#include &lt;sys\/stat.h&gt;<br \/>\n#include &lt;sys\/time.h&gt;<br \/>\n#include &lt;sys\/types.h&gt;<br \/>\n#include &lt;time.h&gt;<br \/>\n#include &lt;unistd.h&gt;<\/p>\n<p>#define CONFIG_PATH &#034;\/etc\/debug-demo.conf&#034;<br \/>\n#define LOG_PATH &#034;\/var\/log\/debug-demo\/debug-demo.log&#034;<br \/>\n#define SERVICE_USER &#034;debug-demo&#034;<br \/>\n#define SERVER_HOST &#034;10.0.2.2&#034;<br \/>\n#define SERVER_PORT &#034;5000&#034;<br \/>\n#define DEFAULT_INTERVAL_SEC 2U<br \/>\n#define MAX_INTERVAL_SEC 60L<br \/>\n#define MAX_LINE_BYTES 256U<br \/>\n#define MAX_RETRY_SECONDS 8U<\/p>\n<p>static volatile sig_atomic_t running &#061; 1;<\/p>\n<p>static void handle_signal(int signal_number)<br \/>\n{<br \/>\n    (void)signal_number;<br \/>\n    running &#061; 0;<br \/>\n}<\/p>\n<p>int compute_total(const int *values, int count)<br \/>\n{<br \/>\n    int total &#061; 0;<\/p>\n<p>    for (int index &#061; 0; index &lt; count; &#043;&#043;index) {<br \/>\n        total &#043;&#061; values[index];<br \/>\n    }<br \/>\n    return total;<br \/>\n}<\/p>\n<p>static unsigned int load_interval(const char **status)<br \/>\n{<br \/>\n    char buffer[256];<br \/>\n    const char prefix[] &#061; &#034;interval_sec&#061;&#034;;<br \/>\n    FILE *config_file &#061; fopen(CONFIG_PATH, &#034;r&#034;);<\/p>\n<p>    if (config_file &#061;&#061; NULL) {<br \/>\n        *status &#061; errno &#061;&#061; ENOENT ? &#034;missing-default&#034; : &#034;read-error-default&#034;;<br \/>\n        return DEFAULT_INTERVAL_SEC;<br \/>\n    }<\/p>\n<p>    size_t length &#061; fread(buffer, 1, sizeof(buffer), config_file);<br \/>\n    int read_failed &#061; ferror(config_file);<br \/>\n    int close_failed &#061; fclose(config_file);<br \/>\n    if (read_failed || close_failed !&#061; 0) {<br \/>\n        *status &#061; &#034;read-error-default&#034;;<br \/>\n        return DEFAULT_INTERVAL_SEC;<br \/>\n    }<\/p>\n<p>    *status &#061; &#034;invalid-default&#034;;<br \/>\n    if (length &#061;&#061; sizeof(buffer) || memchr(buffer, &#039;\\\\0&#039;, length) !&#061; NULL) {<br \/>\n        return DEFAULT_INTERVAL_SEC;<br \/>\n    }<br \/>\n    buffer[length] &#061; &#039;\\\\0&#039;;<\/p>\n<p>    char *begin &#061; buffer;<br \/>\n    while (*begin &#061;&#061; &#039; &#039; || *begin &#061;&#061; &#039;\\\\t&#039; || *begin &#061;&#061; &#039;\\\\r&#039; || *begin &#061;&#061; &#039;\\\\n&#039;) {<br \/>\n        &#043;&#043;begin;<br \/>\n    }<br \/>\n    char *end &#061; buffer &#043; length;<br \/>\n    while (end &gt; begin &amp;&amp;<br \/>\n           (end[-1] &#061;&#061; &#039; &#039; || end[-1] &#061;&#061; &#039;\\\\t&#039; || end[-1] &#061;&#061; &#039;\\\\r&#039; || end[-1] &#061;&#061; &#039;\\\\n&#039;)) {<br \/>\n        &#8211;end;<br \/>\n    }<br \/>\n    *end &#061; &#039;\\\\0&#039;;<\/p>\n<p>    if (strncmp(begin, prefix, sizeof(prefix) &#8211; 1) !&#061; 0) {<br \/>\n        return DEFAULT_INTERVAL_SEC;<br \/>\n    }<br \/>\n    char *number &#061; begin &#043; sizeof(prefix) &#8211; 1;<br \/>\n    if (*number &#061;&#061; &#039;\\\\0&#039;) {<br \/>\n        return DEFAULT_INTERVAL_SEC;<br \/>\n    }<br \/>\n    for (const char *cursor &#061; number; *cursor !&#061; &#039;\\\\0&#039;; &#043;&#043;cursor) {<br \/>\n        if (*cursor &lt; &#039;0&#039; || *cursor &gt; &#039;9&#039;) {<br \/>\n            return DEFAULT_INTERVAL_SEC;<br \/>\n        }<br \/>\n    }<\/p>\n<p>    errno &#061; 0;<br \/>\n    char *number_end &#061; NULL;<br \/>\n    long parsed &#061; strtol(number, &amp;number_end, 10);<br \/>\n    if (errno !&#061; 0 || *number_end !&#061; &#039;\\\\0&#039; ||<br \/>\n        parsed &lt; 1 || parsed &gt; MAX_INTERVAL_SEC) {<br \/>\n        return DEFAULT_INTERVAL_SEC;<br \/>\n    }<\/p>\n<p>    *status &#061; &#034;loaded&#034;;<br \/>\n    return (unsigned int)parsed;<br \/>\n}<\/p>\n<p>static int drop_privileges(uid_t *service_uid, gid_t *service_gid)<br \/>\n{<br \/>\n    struct passwd *account &#061; getpwnam(SERVICE_USER);<br \/>\n    if (account &#061;&#061; NULL) {<br \/>\n        fprintf(stderr, &#034;Required service account &#039;%s&#039; is missing\\\\n&#034;, SERVICE_USER);<br \/>\n        return -1;<br \/>\n    }<\/p>\n<p>    uid_t uid &#061; account-&gt;pw_uid;<br \/>\n    gid_t gid &#061; account-&gt;pw_gid;<br \/>\n    if (uid &#061;&#061; 0 || gid &#061;&#061; 0 || geteuid() !&#061; 0) {<br \/>\n        fprintf(stderr, &#034;Service account or startup identity is invalid\\\\n&#034;);<br \/>\n        return -1;<br \/>\n    }<\/p>\n<p>    if (setgroups(0, NULL) !&#061; 0 || setgid(gid) !&#061; 0 || setuid(uid) !&#061; 0) {<br \/>\n        perror(&#034;drop service privileges&#034;);<br \/>\n        return -1;<br \/>\n    }<br \/>\n    if (getuid() !&#061; uid || geteuid() !&#061; uid ||<br \/>\n        getgid() !&#061; gid || getegid() !&#061; gid) {<br \/>\n        fprintf(stderr, &#034;Privilege drop verification failed\\\\n&#034;);<br \/>\n        return -1;<br \/>\n    }<\/p>\n<p>    *service_uid &#061; uid;<br \/>\n    *service_gid &#061; gid;<br \/>\n    return 0;<br \/>\n}<\/p>\n<p>static int rotate_log(FILE **log_file)<br \/>\n{<br \/>\n    FILE *old_log &#061; *log_file;<br \/>\n    if (fflush(old_log) !&#061; 0) {<br \/>\n        return -1;<br \/>\n    }<\/p>\n<p>    *log_file &#061; NULL;<br \/>\n    if (fclose(old_log) !&#061; 0) {<br \/>\n        return -1;<br \/>\n    }<\/p>\n<p>    if (rename(LOG_PATH, LOG_PATH &#034;.1&#034;) !&#061; 0) {<br \/>\n        int rename_error &#061; errno;<br \/>\n        *log_file &#061; fopen(LOG_PATH, &#034;a&#034;);<br \/>\n        if (*log_file &#061;&#061; NULL) {<br \/>\n            return -1;<br \/>\n        }<br \/>\n        errno &#061; rename_error;<br \/>\n        perror(&#034;rename active log; continuing with current file&#034;);<br \/>\n        return 0;<br \/>\n    }<\/p>\n<p>    *log_file &#061; fopen(LOG_PATH, &#034;a&#034;);<br \/>\n    if (*log_file &#061;&#061; NULL) {<br \/>\n        int open_error &#061; errno;<br \/>\n        if (rename(LOG_PATH &#034;.1&#034;, LOG_PATH) &#061;&#061; 0) {<br \/>\n            *log_file &#061; fopen(LOG_PATH, &#034;a&#034;);<br \/>\n        }<br \/>\n        if (*log_file &#061;&#061; NULL) {<br \/>\n            errno &#061; open_error;<br \/>\n            return -1;<br \/>\n        }<br \/>\n        errno &#061; open_error;<br \/>\n        perror(&#034;open new active log; restored previous path&#034;);<br \/>\n        return 0;<br \/>\n    }<\/p>\n<p>    if (fprintf(*log_file,<br \/>\n                &#034;debug-demo log: rotation complete; active file reopened pid&#061;%ld\\\\n&#034;,<br \/>\n                (long)getpid()) &lt; 0 || fflush(*log_file) !&#061; 0) {<br \/>\n        return -1;<br \/>\n    }<br \/>\n    return 1;<br \/>\n}<\/p>\n<p>static int rotate_if_needed(FILE **log_file)<br \/>\n{<br \/>\n    struct stat log_status;<\/p>\n<p>    if (fflush(*log_file) !&#061; 0 ||<br \/>\n        fstat(fileno(*log_file), &amp;log_status) !&#061; 0) {<br \/>\n        return -1;<br \/>\n    }<br \/>\n    if (log_status.st_size &lt; 1024) {<br \/>\n        return 0;<br \/>\n    }<br \/>\n    return rotate_log(log_file) &lt; 0 ? -1 : 0;<br \/>\n}<\/p>\n<p>static int write_log(FILE **log_file, const char *format, &#8230;)<br \/>\n{<br \/>\n    va_list arguments;<br \/>\n    va_start(arguments, format);<br \/>\n    int result &#061; vfprintf(*log_file, format, arguments);<br \/>\n    va_end(arguments);<\/p>\n<p>    if (result &lt; 0 || fputc(&#039;\\\\n&#039;, *log_file) &#061;&#061; EOF || fflush(*log_file) !&#061; 0) {<br \/>\n        return -1;<br \/>\n    }<br \/>\n    return rotate_if_needed(log_file);<br \/>\n}<\/p>\n<p>static int connect_server(void)<br \/>\n{<br \/>\n    struct addrinfo hints &#061; {0};<br \/>\n    struct addrinfo *addresses &#061; NULL;<br \/>\n    hints.ai_family &#061; AF_INET;<br \/>\n    hints.ai_socktype &#061; SOCK_STREAM;<\/p>\n<p>    int lookup_result &#061; getaddrinfo(SERVER_HOST, SERVER_PORT, &amp;hints, &amp;addresses);<br \/>\n    if (lookup_result !&#061; 0) {<br \/>\n        fprintf(stderr, &#034;getaddrinfo: %s\\\\n&#034;, gai_strerror(lookup_result));<br \/>\n        errno &#061; EHOSTUNREACH;<br \/>\n        return -1;<br \/>\n    }<\/p>\n<p>    int connected_socket &#061; -1;<br \/>\n    for (struct addrinfo *address &#061; addresses; address !&#061; NULL;<br \/>\n         address &#061; address-&gt;ai_next) {<br \/>\n        int socket_fd &#061; socket(address-&gt;ai_family, address-&gt;ai_socktype,<br \/>\n                               address-&gt;ai_protocol);<br \/>\n        if (socket_fd &lt; 0) {<br \/>\n            continue;<br \/>\n        }<br \/>\n        if (connect(socket_fd, address-&gt;ai_addr, address-&gt;ai_addrlen) &#061;&#061; 0) {<br \/>\n            connected_socket &#061; socket_fd;<br \/>\n            break;<br \/>\n        }<br \/>\n        close(socket_fd);<br \/>\n    }<\/p>\n<p>    freeaddrinfo(addresses);<br \/>\n    if (connected_socket &lt; 0) {<br \/>\n        return -1;<br \/>\n    }<\/p>\n<p>    struct timeval receive_timeout &#061; {5, 0};<br \/>\n    if (setsockopt(connected_socket, SOL_SOCKET, SO_RCVTIMEO,<br \/>\n                   &amp;receive_timeout, sizeof(receive_timeout)) !&#061; 0) {<br \/>\n        int saved_error &#061; errno;<br \/>\n        close(connected_socket);<br \/>\n        errno &#061; saved_error;<br \/>\n        return -1;<br \/>\n    }<br \/>\n    return connected_socket;<br \/>\n}<\/p>\n<p>static int send_all(int socket_fd, const char *data, size_t length)<br \/>\n{<br \/>\n    size_t sent &#061; 0;<br \/>\n    while (sent &lt; length) {<br \/>\n        ssize_t result &#061; send(socket_fd, data &#043; sent, length &#8211; sent, MSG_NOSIGNAL);<br \/>\n        if (result &lt; 0 &amp;&amp; errno &#061;&#061; EINTR) {<br \/>\n            if (!running) {<br \/>\n                return -1;<br \/>\n            }<br \/>\n            continue;<br \/>\n        }<br \/>\n        if (result &lt;&#061; 0) {<br \/>\n            if (result &#061;&#061; 0) {<br \/>\n                errno &#061; EPIPE;<br \/>\n            }<br \/>\n            return -1;<br \/>\n        }<br \/>\n        sent &#043;&#061; (size_t)result;<br \/>\n    }<br \/>\n    return 0;<br \/>\n}<\/p>\n<p>static int receive_line(int socket_fd, char *line, size_t capacity)<br \/>\n{<br \/>\n    size_t used &#061; 0;<br \/>\n    for (;;) {<br \/>\n        char byte;<br \/>\n        ssize_t result &#061; recv(socket_fd, &amp;byte, 1, 0);<br \/>\n        if (result &#061;&#061; 0) {<br \/>\n            if (used &#061;&#061; 0) {<br \/>\n                return 0;<br \/>\n            }<br \/>\n            errno &#061; EPROTO;<br \/>\n            return -1;<br \/>\n        }<br \/>\n        if (result &lt; 0) {<br \/>\n            if (errno &#061;&#061; EINTR &amp;&amp; running) {<br \/>\n                continue;<br \/>\n            }<br \/>\n            return -1;<br \/>\n        }<br \/>\n        if (byte &#061;&#061; &#039;\\\\n&#039;) {<br \/>\n            line[used] &#061; &#039;\\\\0&#039;;<br \/>\n            return 1;<br \/>\n        }<br \/>\n        if (used &#043; 1 &gt;&#061; capacity) {<br \/>\n            errno &#061; EMSGSIZE;<br \/>\n            return -1;<br \/>\n        }<br \/>\n        line[used&#043;&#043;] &#061; byte;<br \/>\n    }<br \/>\n}<\/p>\n<p>static void wait_seconds(unsigned int seconds)<br \/>\n{<br \/>\n    struct timespec remaining &#061; {(time_t)seconds, 0};<br \/>\n    while (running &amp;&amp; nanosleep(&amp;remaining, &amp;remaining) !&#061; 0) {<br \/>\n        if (errno !&#061; EINTR) {<br \/>\n            return;<br \/>\n        }<br \/>\n    }<br \/>\n}<\/p>\n<p>static unsigned int increase_backoff(unsigned int seconds)<br \/>\n{<br \/>\n    if (seconds &gt;&#061; MAX_RETRY_SECONDS \/ 2) {<br \/>\n        return MAX_RETRY_SECONDS;<br \/>\n    }<br \/>\n    return seconds * 2;<br \/>\n}<\/p>\n<p>static int retry_after_disconnect(FILE **log_file, unsigned int *backoff)<br \/>\n{<br \/>\n    if (write_log(log_file, &#034;tcp: retry in %u second(s)&#034;, *backoff) !&#061; 0) {<br \/>\n        return -1;<br \/>\n    }<br \/>\n    wait_seconds(*backoff);<br \/>\n    *backoff &#061; increase_backoff(*backoff);<br \/>\n    return 0;<br \/>\n}<\/p>\n<p>static int run_client(FILE **log_file, unsigned int interval_sec)<br \/>\n{<br \/>\n    unsigned long sequence &#061; 0;<br \/>\n    unsigned int backoff &#061; 1;<\/p>\n<p>    while (running) {<br \/>\n        int socket_fd &#061; connect_server();<br \/>\n        if (socket_fd &lt; 0) {<br \/>\n            int saved_error &#061; errno;<br \/>\n            if (write_log(log_file, &#034;tcp: connect failed host&#061;%s port&#061;%s error&#061;%s&#034;,<br \/>\n                          SERVER_HOST, SERVER_PORT, strerror(saved_error)) !&#061; 0 ||<br \/>\n                retry_after_disconnect(log_file, &amp;backoff) !&#061; 0) {<br \/>\n                return -1;<br \/>\n            }<br \/>\n            continue;<br \/>\n        }<\/p>\n<p>        if (write_log(log_file, &#034;tcp: connected host&#061;%s port&#061;%s&#034;,<br \/>\n                      SERVER_HOST, SERVER_PORT) !&#061; 0) {<br \/>\n            close(socket_fd);<br \/>\n            return -1;<br \/>\n        }<\/p>\n<p>        while (running) {<br \/>\n            char payload[64];<br \/>\n            char frame[80];<br \/>\n            char response[MAX_LINE_BYTES];<br \/>\n            int payload_length &#061; snprintf(payload, sizeof(payload),<br \/>\n                                          &#034;tick&#061;%lu&#034;, sequence);<br \/>\n            int frame_length &#061; snprintf(frame, sizeof(frame), &#034;%s\\\\n&#034;, payload);<br \/>\n            if (payload_length &lt; 0 || (size_t)payload_length &gt;&#061; sizeof(payload) ||<br \/>\n                frame_length &lt; 0 || (size_t)frame_length &gt;&#061; sizeof(frame)) {<br \/>\n                close(socket_fd);<br \/>\n                errno &#061; EMSGSIZE;<br \/>\n                return -1;<br \/>\n            }<\/p>\n<p>            if (send_all(socket_fd, frame, (size_t)frame_length) !&#061; 0) {<br \/>\n                int saved_error &#061; errno;<br \/>\n                if (write_log(log_file, &#034;tcp: send failed error&#061;%s&#034;,<br \/>\n                              strerror(saved_error)) !&#061; 0) {<br \/>\n                    close(socket_fd);<br \/>\n                    return -1;<br \/>\n                }<br \/>\n                break;<br \/>\n            }<\/p>\n<p>            int receive_result &#061; receive_line(socket_fd, response, sizeof(response));<br \/>\n            if (receive_result &#061;&#061; 0) {<br \/>\n                if (write_log(log_file, &#034;tcp: peer closed connection&#034;) !&#061; 0) {<br \/>\n                    close(socket_fd);<br \/>\n                    return -1;<br \/>\n                }<br \/>\n                break;<br \/>\n            }<br \/>\n            if (receive_result &lt; 0) {<br \/>\n                int saved_error &#061; errno;<br \/>\n                if (write_log(log_file, &#034;tcp: receive failed error&#061;%s&#034;,<br \/>\n                              strerror(saved_error)) !&#061; 0) {<br \/>\n                    close(socket_fd);<br \/>\n                    return -1;<br \/>\n                }<br \/>\n                break;<br \/>\n            }<\/p>\n<p>            if (write_log(log_file, &#034;tcp: sent&#061;%s received&#061;%s&#034;, payload, response) !&#061; 0) {<br \/>\n                close(socket_fd);<br \/>\n                return -1;<br \/>\n            }<br \/>\n            &#043;&#043;sequence;<br \/>\n            backoff &#061; 1;<br \/>\n            wait_seconds(interval_sec);<br \/>\n        }<\/p>\n<p>        close(socket_fd);<br \/>\n        if (running &amp;&amp; retry_after_disconnect(log_file, &amp;backoff) !&#061; 0) {<br \/>\n            return -1;<br \/>\n        }<br \/>\n    }<br \/>\n    return 0;<br \/>\n}<\/p>\n<p>int main(int argc, char *argv[])<br \/>\n{<br \/>\n    const int values[] &#061; {10, 20, 30, 40};<br \/>\n    int total &#061; compute_total(values, 4);<\/p>\n<p>    if (argc &#061;&#061; 1) {<br \/>\n        printf(&#034;debug-demo package v2: total &#061; %d\\\\n&#034;, total);<br \/>\n        return 0;<br \/>\n    }<br \/>\n    if (argc !&#061; 2 || strcmp(argv[1], &#034;&#8211;service&#034;) !&#061; 0) {<br \/>\n        fprintf(stderr, &#034;Usage: %s [&#8211;service]\\\\n&#034;, argv[0]);<br \/>\n        return 1;<br \/>\n    }<\/p>\n<p>    struct sigaction action &#061; {0};<br \/>\n    action.sa_handler &#061; handle_signal;<br \/>\n    sigemptyset(&amp;action.sa_mask);<br \/>\n    if (sigaction(SIGTERM, &amp;action, NULL) !&#061; 0 ||<br \/>\n        sigaction(SIGINT, &amp;action, NULL) !&#061; 0) {<br \/>\n        perror(&#034;sigaction&#034;);<br \/>\n        return 1;<br \/>\n    }<\/p>\n<p>    uid_t service_uid;<br \/>\n    gid_t service_gid;<br \/>\n    if (drop_privileges(&amp;service_uid, &amp;service_gid) !&#061; 0) {<br \/>\n        return 1;<br \/>\n    }<\/p>\n<p>    const char *config_status &#061; NULL;<br \/>\n    unsigned int interval_sec &#061; load_interval(&amp;config_status);<br \/>\n    umask(027);<br \/>\n    FILE *log_file &#061; fopen(LOG_PATH, &#034;a&#034;);<br \/>\n    if (log_file &#061;&#061; NULL) {<br \/>\n        perror(&#034;open log as service user&#034;);<br \/>\n        return 1;<br \/>\n    }<\/p>\n<p>    if (write_log(&amp;log_file,<br \/>\n                  &#034;debug-demo start: pid&#061;%ld uid&#061;%ld gid&#061;%ld config&#061;%s interval_sec&#061;%u&#034;,<br \/>\n                  (long)getpid(), (long)service_uid, (long)service_gid,<br \/>\n                  config_status, interval_sec) !&#061; 0 ||<br \/>\n        run_client(&amp;log_file, interval_sec) !&#061; 0) {<br \/>\n        perror(&#034;debug-demo service&#034;);<br \/>\n        if (log_file !&#061; NULL) {<br \/>\n            fclose(log_file);<br \/>\n        }<br \/>\n        return 1;<br \/>\n    }<\/p>\n<p>    if (write_log(&amp;log_file, &#034;debug-demo service: pid&#061;%ld stopped&#034;,<br \/>\n                  (long)getpid()) !&#061; 0) {<br \/>\n        perror(&#034;write final service log&#034;);<br \/>\n        if (log_file !&#061; NULL) {<br \/>\n            fclose(log_file);<br \/>\n        }<br \/>\n        return 1;<br \/>\n    }<br \/>\n    return fclose(log_file) &#061;&#061; 0 ? 0 : 1;<br \/>\n}<br \/>\nEOF<\/span><\/p>\n<p>\u4ee3\u7801\u4fdd\u7559\u4e86\u524d\u6587\u7684\u670d\u52a1\u8d26\u6237\u964d\u6743\u3001\u914d\u7f6e\u8bfb\u53d6\u3001\u65e5\u5fd7\u76ee\u5f55\u548c 1 KiB \u65e5\u5fd7\u8f6e\u8f6c\u3002\u65b0\u589e\u7684 send_all() \u5904\u7406\u77ed\u5199&#xff1b;receive_line() \u8bfb\u5230\u6362\u884c\u7b26\u624d\u8fd4\u56de\u5b8c\u6574\u54cd\u5e94&#xff0c;\u5e76\u5bf9\u8d85\u957f\u884c\u548c\u4e2d\u9014 EOF \u62a5\u9519\u3002\u8fde\u63a5\u9519\u8bef\u3001\u63a5\u6536\u8d85\u65f6\u6216\u5bf9\u7aef\u5173\u95ed\u540e&#xff0c;\u5f53\u524d\u8fde\u63a5\u4f1a\u88ab\u5173\u95ed&#xff0c;\u968f\u540e\u6309 1\u30012\u30014\u30018 \u79d2\u9000\u907f\u91cd\u8bd5&#xff1b;\u6210\u529f\u5904\u7406\u54cd\u5e94\u540e&#xff0c;\u9000\u907f\u7b49\u5f85\u6062\u590d\u4e3a 1 \u79d2\u3002<\/p>\n<p>SO_RCVTIMEO \u8bbe\u7f6e\u7684 5 \u79d2\u9488\u5bf9\u5355\u6b21\u963b\u585e\u63a5\u6536\u7b49\u5f85&#xff0c;\u4e0d\u662f\u6574\u6761\u54cd\u5e94\u6216\u6574\u4e2a\u8bf7\u6c42\u7684\u603b\u65f6\u9650\u3002\u672c\u4f8b\u9010\u5b57\u8282\u8bfb\u53d6&#xff0c;\u82e5\u5bf9\u7aef\u6301\u7eed\u5728\u6bcf\u6b21\u8d85\u65f6\u524d\u53d1\u6765\u4e00\u4e2a\u5b57\u8282&#xff0c;\u5b8c\u6574\u54cd\u5e94\u53ef\u80fd\u8017\u65f6\u8fdc\u8d85 5 \u79d2\u3002connect() \u548c send() \u4ecd\u662f\u963b\u585e\u8c03\u7528&#xff0c;\u672a\u8bbe\u7f6e\u5e94\u7528\u5c42\u8d85\u65f6&#xff1b;\u9700\u8981\u603b\u65f6\u9650\u7684\u5b9e\u73b0\u5e94\u4f7f\u7528\u5355\u8c03\u65f6\u949f\u8ba1\u7b97\u622a\u6b62\u65f6\u95f4&#xff0c;\u5e76\u914d\u5408\u975e\u963b\u585e I\/O \u6216 poll() \u7b49\u673a\u5236\u3002<\/p>\n<p>\u6240\u6709\u65e5\u5fd7\u5199\u5165\u90fd\u68c0\u67e5\u8fd4\u56de\u503c&#xff1b;\u53d1\u751f\u4e0d\u53ef\u6062\u590d\u7684\u65e5\u5fd7\u9519\u8bef\u65f6&#xff0c;\u5ba2\u6237\u7aef\u7ed3\u675f\u670d\u52a1&#xff0c;\u800c\u4e0d\u662f\u7ee7\u7eed\u4f7f\u7528\u53ef\u80fd\u5df2\u88ab\u8f6e\u8f6c\u5931\u8d25\u7f6e\u7a7a\u7684\u65e5\u5fd7\u6307\u9488\u3002BusyBox init \u53ef\u80fd\u968f\u540e\u518d\u6b21\u542f\u52a8\u670d\u52a1&#xff0c;\u56e0\u6b64\u6301\u7eed\u7684\u5b58\u50a8\u6545\u969c\u4ecd\u9700\u4eba\u5de5\u6392\u67e5\u3002<\/p>\n<p>\u8fd9\u4efd\u4ee3\u7801\u7528\u4e8e\u5b9e\u9a8c&#xff0c;\u4e0d\u7b49\u540c\u4e8e\u751f\u4ea7\u7f51\u7edc\u5ba2\u6237\u7aef\u3002\u5b83\u628a\u6536\u5230\u7684\u5b8c\u6574\u884c\u4f5c\u4e3a\u54cd\u5e94\u8bb0\u5f55&#xff0c;\u6ca1\u6709\u4e25\u683c\u9a8c\u8bc1\u54cd\u5e94\u662f\u5426\u7b49\u4e8e\u5f53\u524d\u8bf7\u6c42\u5bf9\u5e94\u7684 ACK tick&#061;N&#xff1b;\u6587\u4e2d\u7684\u5bf9\u5e94\u5173\u7cfb\u7531\u5b9e\u6d4b\u65e5\u5fd7\u6838\u5bf9\u3002\u91cd\u8fde\u540e\u8bf7\u6c42\u5e8f\u53f7\u5ef6\u7eed\u8fdb\u7a0b\u5185\u72b6\u6001&#xff0c;\u4f46\u8bf7\u6c42\u8d85\u65f6\u540e\u7684\u4e1a\u52a1\u7ed3\u679c\u53ef\u80fd\u4e0d\u786e\u5b9a&#xff0c;\u4e0d\u80fd\u636e\u6b64\u63a8\u65ad\u8bf7\u6c42\u201c\u6070\u597d\u6267\u884c\u4e00\u6b21\u201d\u3002\u5b9e\u9645\u534f\u8bae\u8fd8\u9700\u5b9a\u4e49\u54cd\u5e94\u6821\u9a8c\u3001\u5e42\u7b49\u952e\u3001\u8ba4\u8bc1\u3001\u52a0\u5bc6\u548c\u4e1a\u52a1\u8d85\u65f6\u7b56\u7565\u3002<\/p>\n<h3>\u4e03\u3001\u5173\u673a\u91cd\u5efa\u955c\u50cf<\/h3>\n<p>\u786e\u8ba4 QEMU \u5df2\u9000\u51fa\u540e&#xff0c;\u5728 Ubuntu \u4e3b\u673a\u7ec8\u7aef B \u6267\u884c&#xff1b;\u4e0d\u9700\u8981\u505c\u6b62\u7ec8\u7aef A \u4e2d\u7684 Python \u670d\u52a1&#xff1a;<\/p>\n<p><span class=\"token builtin class-name\">export<\/span> <span class=\"token assign-left variable\">DEMO_OUT<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token environment constant\">$HOME<\/span>\/buildroot-output-arm64-demo&#034;<\/span><br \/>\n<span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token builtin class-name\">set<\/span> <span class=\"token parameter variable\">-eu<\/span><br \/>\n    <span class=\"token builtin class-name\">cd<\/span> <span class=\"token string\">&#034;<span class=\"token environment constant\">$HOME<\/span>\/buildroot-2025.02.8&#034;<\/span><br \/>\n    <span class=\"token function\">make<\/span> <span class=\"token assign-left variable\">O<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">${DEMO_OUT<span class=\"token operator\">\ud83d\ude15<\/span>\u8bf7\u5148\u8bbe\u7f6e DEMO_OUT}<\/span>&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n      <span class=\"token assign-left variable\">BR2_EXTERNAL<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token environment constant\">$HOME<\/span>\/buildroot-external-demo&#034;<\/span> debug-demo-rebuild <span class=\"token assign-left variable\">V<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span><br \/>\n    <span class=\"token function\">make<\/span> <span class=\"token assign-left variable\">O<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">${DEMO_OUT<span class=\"token operator\">\ud83d\ude15<\/span>\u8bf7\u5148\u8bbe\u7f6e DEMO_OUT}<\/span>&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n      <span class=\"token assign-left variable\">BR2_EXTERNAL<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token environment constant\">$HOME<\/span>\/buildroot-external-demo&#034;<\/span> <span class=\"token parameter variable\">-j2<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token variable\">$?<\/span><\/p>\n<p>debug-demo-rebuild \u7f16\u8bd1\u5e76\u5b89\u88c5\u5e94\u7528&#xff1b;\u5b8c\u6574 make \u91cd\u65b0\u751f\u6210 rootfs \u955c\u50cf\u3002\u672c\u6587\u53ea\u4f7f\u7528 libc\/POSIX socket \u63a5\u53e3&#xff0c;\u4e0d\u9700\u8981\u989d\u5916 Buildroot \u5e93\u6216\u6539\u53d8\u5de5\u5177\u94fe\u3002\u4e0d\u8981\u5728 QEMU \u6b63\u4f7f\u7528 rootfs.ext2 \u65f6\u91cd\u5efa\u955c\u50cf\u3002<\/p>\n<p>\u6784\u5efa\u547d\u4ee4\u5e94\u8fd4\u56de 0&#xff1b;\u975e\u96f6\u65f6\u4e0d\u8981\u7ee7\u7eed\u542f\u52a8\u955c\u50cf\u3002\u672c\u8f6e\u5df2\u5b8c\u6210\u4fee\u8ba2\u7248 QEMU \u6536\u53d1\u3001\u65ad\u7ebf\u91cd\u8fde\u548c init \u91cd\u542f\u9a8c\u8bc1&#xff0c;\u4f46\u5f53\u65f6\u7684\u6784\u5efa\u9000\u51fa\u7801\u672a\u8bb0\u5f55\u3002\u8fd0\u884c\u65e5\u5fd7\u80fd\u8bc1\u660e\u7cfb\u7edf\u542f\u52a8\u5e76\u8fd0\u884c&#xff0c;\u4e0d\u80fd\u8865\u51fa\u5386\u53f2\u6784\u5efa\u9000\u51fa\u7801&#xff1b;\u5982\u9700\u53d1\u5e03\u6784\u5efa\u72b6\u6001&#xff0c;\u5e94\u5982\u5b9e\u6ce8\u660e\u672a\u8bb0\u5f55&#xff0c;\u6216\u91cd\u65b0\u6784\u5efa\u5e76\u660e\u786e\u6807\u6ce8\u65b0\u6784\u5efa\u7684\u7ed3\u679c&#xff0c;\u4e0d\u5fc5\u56e0\u6b64\u91cd\u590d\u5df2\u5b8c\u6210\u7684 QEMU \u56de\u5f52\u3002<\/p>\n<h3>\u516b\u3001\u4fdd\u6301\u6d4b\u8bd5\u670d\u52a1\u8fd0\u884c&#xff0c;\u542f\u52a8 QEMU<\/h3>\n<p>\u5148\u786e\u8ba4 Ubuntu \u4e3b\u673a\u7ec8\u7aef A \u4e2d\u7b2c\u56db\u8282\u7684 Python \u670d\u52a1\u4ecd\u5728\u8fd0\u884c\u3002\u82e5\u5b83\u4e00\u76f4\u4fdd\u6301\u76d1\u542c&#xff0c;\u76f4\u63a5\u7ee7\u7eed&#xff0c;\u4e0d\u8981\u91cd\u590d\u6267\u884c\u670d\u52a1\u542f\u52a8\u547d\u4ee4&#xff1b;\u53ea\u6709\u670d\u52a1\u5df2\u9000\u51fa\u65f6&#xff0c;\u624d\u5728\u7ec8\u7aef A \u91cd\u65b0\u6267\u884c\u7b2c\u56db\u8282\u547d\u4ee4\u3002<\/p>\n<p>\u6784\u5efa\u6210\u529f\u540e&#xff0c;\u5728 Ubuntu \u4e3b\u673a\u7ec8\u7aef B \u542f\u52a8 QEMU&#xff1a;<\/p>\n<p><span class=\"token builtin class-name\">export<\/span> <span class=\"token assign-left variable\">DEMO_OUT<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token environment constant\">$HOME<\/span>\/buildroot-output-arm64-demo&#034;<\/span><\/p>\n<p>\/usr\/bin\/qemu-system-aarch64 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-M<\/span> virt <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-cpu<\/span> cortex-a53 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-smp<\/span> <span class=\"token number\">2<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-m<\/span> 1G <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-nographic<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-kernel<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">${DEMO_OUT<span class=\"token operator\">\ud83d\ude15<\/span>\u8bf7\u5148\u8bbe\u7f6e DEMO_OUT}<\/span>\/images\/Image&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-append<\/span> <span class=\"token string\">&#034;rootwait root&#061;\/dev\/vda console&#061;ttyAMA0&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-drive<\/span> <span class=\"token assign-left variable\">file<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">$DEMO_OUT<\/span>\/images\/rootfs.ext2&#034;<\/span>,if<span class=\"token operator\">&#061;<\/span>none,format<span class=\"token operator\">&#061;<\/span>raw,id<span class=\"token operator\">&#061;<\/span>hd0 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-device<\/span> virtio-blk-device,drive<span class=\"token operator\">&#061;<\/span>hd0 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-netdev<\/span> user,id<span class=\"token operator\">&#061;<\/span>net0 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-device<\/span> virtio-net-device,netdev<span class=\"token operator\">&#061;<\/span>net0<\/p>\n<p>\u6267\u884c\u4e0a\u8ff0\u547d\u4ee4\u540e&#xff0c;\u7ec8\u7aef B \u88ab QEMU \u5360\u7528&#xff0c;\u663e\u793a\u7684\u662f\u76ee\u6807\u7cfb\u7edf\u7684\u4e32\u53e3\u63a7\u5236\u53f0&#xff0c;\u4e0d\u518d\u662f Ubuntu \u4e3b\u673a shell\u3002\u4ee5 root \u767b\u5f55\u540e&#xff0c;\u5728\u8fd9\u4e2a QEMU \u76ee\u6807\u7aef\u786e\u8ba4\u670d\u52a1\u53ea\u6709\u4e00\u4e2a\u5b9e\u4f8b&#xff0c;\u5e76\u67e5\u770b\u65e5\u5fd7&#xff1a;<\/p>\n<p>pidof debug_demo<br \/>\n<span class=\"token assign-left variable\">service_pid<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span>pidof debug_demo<span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-E<\/span> <span class=\"token string\">&#039;^(Name|Uid|Gid|Groups):&#039;<\/span> <span class=\"token string\">&#034;\/proc\/<span class=\"token variable\">$service_pid<\/span>\/status&#034;<\/span><br \/>\n<span class=\"token function\">tail<\/span> <span class=\"token parameter variable\">-n<\/span> <span class=\"token number\">20<\/span> \/var\/log\/debug-demo\/debug-demo.log<\/p>\n<p>\u6b64\u540e&#xff0c;\u4e3b\u673a\u670d\u52a1\u8f93\u51fa\u770b\u7ec8\u7aef A&#xff0c;\u76ee\u6807\u7aef\u547d\u4ee4\u5728\u7ec8\u7aef B \u6267\u884c\u3002\u82e5\u8fd8\u9700\u8981\u6267\u884c Ubuntu \u4e3b\u673a\u547d\u4ee4&#xff0c;\u8bf7\u53e6\u5f00\u4e00\u4e2a\u4e3b\u673a\u7ec8\u7aef&#xff0c;\u4e0d\u8981\u628a\u4e3b\u673a\u547d\u4ee4\u8f93\u5165 QEMU \u63a7\u5236\u53f0\u3002<\/p>\n<p>\u672c\u8f6e\u56de\u5f52\u5728 QEMU \u76ee\u6807\u7aef\u53d6\u5f97\u7684\u5b9e\u9645\u8f93\u51fa\u5982\u4e0b&#xff1a;<\/p>\n<p># pidof debug_demo<br \/>\n121<br \/>\n# service_pid&#061;$(pidof debug_demo)<br \/>\n# grep -E &#039;^(Name|Uid|Gid|Groups):&#039; &#034;\/proc\/$service_pid\/status&#034;<br \/>\nName:   debug_demo<br \/>\nUid:    100     100     100     100<br \/>\nGid:    101     101     101     101<br \/>\nGroups:<br \/>\n# tail -n 20 \/var\/log\/debug-demo\/debug-demo.log<br \/>\ndebug-demo start: pid&#061;121 uid&#061;100 gid&#061;101 config&#061;loaded interval_sec&#061;2<br \/>\ntcp: connected host&#061;10.0.2.2 port&#061;5000<br \/>\ntcp: sent&#061;tick&#061;0 received&#061;ACK tick&#061;0<br \/>\ntcp: sent&#061;tick&#061;1 received&#061;ACK tick&#061;1<br \/>\ntcp: sent&#061;tick&#061;2 received&#061;ACK tick&#061;2<br \/>\ntcp: sent&#061;tick&#061;3 received&#061;ACK tick&#061;3<br \/>\ntcp: sent&#061;tick&#061;4 received&#061;ACK tick&#061;4<br \/>\ntcp: sent&#061;tick&#061;5 received&#061;ACK tick&#061;5<br \/>\ntcp: sent&#061;tick&#061;6 received&#061;ACK tick&#061;6<br \/>\ntcp: sent&#061;tick&#061;7 received&#061;ACK tick&#061;7<br \/>\ntcp: sent&#061;tick&#061;8 received&#061;ACK tick&#061;8<\/p>\n<p>\u8fd9\u4efd\u8bb0\u5f55\u786e\u8ba4\u4e86\u4ee5\u4e0b\u7ed3\u679c&#xff1a;<\/p>\n<ul>\n<li>\u68c0\u67e5\u65f6 pidof \u53ea\u8fd4\u56de\u4e00\u4e2a PID&#xff0c;\u5373 121&#xff1b;\u8fd9\u662f\u672c\u8f6e\u8fd0\u884c\u503c&#xff0c;\u4e0d\u5e94\u5728\u540e\u7eed\u547d\u4ee4\u4e2d\u5199\u6b7b\u3002<\/li>\n<li>\u8be5\u8fdb\u7a0b\u7684\u771f\u5b9e\u3001\u6709\u6548\u3001\u4fdd\u5b58\u548c\u6587\u4ef6\u7cfb\u7edf UID \u5747\u4e3a 100&#xff0c;GID \u5747\u4e3a 101&#xff0c;\u9644\u52a0\u7ec4\u4e3a\u7a7a\u3002\u767b\u5f55\u63a7\u5236\u53f0\u4f7f\u7528 root&#xff0c;\u4e0d\u4ee3\u8868\u670d\u52a1\u4e5f\u4ee5 root \u8eab\u4efd\u8fd0\u884c\u3002<\/li>\n<li>\u914d\u7f6e\u8bfb\u53d6\u6210\u529f&#xff0c;\u914d\u7f6e\u7684\u53d1\u9001\u95f4\u9694\u4e3a 2 \u79d2&#xff1b;\u8fd9\u91cc\u6ca1\u6709\u65f6\u95f4\u6233&#xff0c;\u4e0d\u80fd\u636e\u6b64\u6d4b\u91cf\u5b9e\u9645\u6536\u53d1\u95f4\u9694\u3002<\/li>\n<li>\u5ba2\u6237\u7aef\u5df2\u8fde\u63a5 10.0.2.2:5000&#xff0c;\u8bb0\u5f55\u4e86 tick&#061;0 \u81f3 tick&#061;8 \u5171 9 \u6b21\u8bf7\u6c42\u53ca\u5bf9\u5e94\u7684 ACK \u54cd\u5e94\u3002<\/li>\n<\/ul>\n<p>\u56e0\u6b64&#xff0c;\u672c\u8f6e\u975e root \u5ba2\u6237\u7aef\u7684\u57fa\u672c TCP \u8bf7\u6c42\/\u54cd\u5e94\u5df2\u8dd1\u901a\u3002\u65ad\u7ebf\u91cd\u8fde\u3001\u9000\u907f\u548c init \u91cd\u542f\u7684\u672c\u8f6e\u7ed3\u679c\u89c1\u7b2c\u4e5d\u8282&#xff1b;\u65e5\u5fd7\u5199\u5165\u5931\u8d25\u5206\u652f\u53ca\u77ed\u5199\u3001\u8d85\u957f\u884c\u3001\u4e0d\u5b8c\u6574\u5e27\u7b49\u5f02\u5e38\u8fb9\u754c\u4ecd\u672a\u4e13\u9879\u6d4b\u8bd5\u3002<\/p>\n<p>\u5982\u679c\u65e5\u5fd7\u53cd\u590d\u663e\u793a Connection refused&#xff0c;\u5148\u68c0\u67e5\u4e3b\u673a Python \u670d\u52a1\u662f\u5426\u4ecd\u8fd0\u884c\u3001\u7aef\u53e3\u662f\u5426\u4e00\u81f4&#xff0c;\u4ee5\u53ca\u4e3b\u673a\u9632\u706b\u5899\u662f\u5426\u5141\u8bb8\u8be5\u8fde\u63a5\u3002\u82e5 QEMU user-mode \u7f51\u5173\u5e76\u975e 10.0.2.2&#xff0c;\u6309\u5b9e\u9645\u7f51\u7edc\u914d\u7f6e\u4fee\u6539 SERVER_HOST \u540e\u91cd\u65b0\u7f16\u8bd1\u3002<\/p>\n<h3>\u4e5d\u3001\u9a8c\u8bc1\u6536\u53d1\u3001\u65ad\u7ebf\u91cd\u8fde\u4e0e\u8fdb\u7a0b\u6062\u590d<\/h3>\n<p>\u8bb0\u5f55\u5f52\u5c5e&#xff1a; \u672c\u8282\u53ea\u8bb0\u5f55\u672c\u8f6e\u4fee\u8ba2\u7248\u5b9e\u9a8c\u3002\u672c\u8f6e\u5ba2\u6237\u7aef\u5148\u7531 PID 121 \u8fd0\u884c&#xff0c;SIGTERM \u540e\u7531 init \u62c9\u8d77 PID 133\u3002\u82e5\u91cd\u542f\u6216\u91cd\u65b0\u767b\u5f55\u540e PID \u53d8\u5316&#xff0c;\u4ee5\u73b0\u573a\u67e5\u8be2\u4e3a\u51c6\u3002<\/p>\n<h4>1. \u9a8c\u8bc1\u4e00\u95ee\u4e00\u7b54<\/h4>\n<p>\u89c2\u5bdf\u4e3b\u673a Python \u670d\u52a1\u7ec8\u7aef\u7684 received&#061;&#8230; sent&#061;&#8230;&#xff0c;\u4ee5\u53ca QEMU \u670d\u52a1\u65e5\u5fd7\u4e2d\u7684 sent&#061;&#8230; received&#061;&#8230;\u3002\u4e24\u8fb9\u7684\u884c\u5185\u5bb9\u5e94\u5bf9\u5e94\u3002\u6bcf\u6b21\u5faa\u73af\u53d1\u9001\u4e00\u884c tick&#061;N&#xff0c;\u4e3b\u673a\u6309\u6362\u884c\u7b26\u89e3\u6790&#xff0c;\u5e76\u56de\u4e00\u884c ACK tick&#061;N\u3002<\/p>\n<p>bytearray(b&#039;tick&#061;0&#039;) \u662f Python \u5bf9\u5b57\u8282\u6570\u7ec4\u7684\u6253\u5370\u5f62\u5f0f&#xff0c;\u4e0d\u662f\u989d\u5916\u7684\u534f\u8bae\u5185\u5bb9\u3002\u8bf7\u6c42\u672b\u5c3e\u7684\u6362\u884c\u7b26\u5df2\u88ab partition(b&#034;\\\\n&#034;) \u5206\u79bb&#xff0c;\u6240\u4ee5 received \u4e2d\u4e0d\u663e\u793a\u5b83&#xff1b;sent&#061;b&#039;ACK tick&#061;0\\\\n&#039; \u4e2d\u7684 \\\\n \u8868\u793a\u54cd\u5e94\u786e\u5b9e\u5e26\u6709\u6362\u884c\u7b26\u3002<\/p>\n<p>\u672c\u8f6e Ubuntu \u4e3b\u673a\u7ec8\u7aef A \u7684\u5b9e\u9645\u8f93\u51fa\u5982\u4e0b&#xff1a;<\/p>\n<p>test server listening on 0.0.0.0:5000<br \/>\naccepted (&#039;127.0.0.1&#039;, 37286)<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;0&#039;) sent&#061;b&#039;ACK tick&#061;0\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;1&#039;) sent&#061;b&#039;ACK tick&#061;1\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;2&#039;) sent&#061;b&#039;ACK tick&#061;2\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;3&#039;) sent&#061;b&#039;ACK tick&#061;3\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;4&#039;) sent&#061;b&#039;ACK tick&#061;4\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;5&#039;) sent&#061;b&#039;ACK tick&#061;5\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;6&#039;) sent&#061;b&#039;ACK tick&#061;6\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;7&#039;) sent&#061;b&#039;ACK tick&#061;7\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;8&#039;) sent&#061;b&#039;ACK tick&#061;8\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;9&#039;) sent&#061;b&#039;ACK tick&#061;9\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;10&#039;) sent&#061;b&#039;ACK tick&#061;10\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;11&#039;) sent&#061;b&#039;ACK tick&#061;11\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;12&#039;) sent&#061;b&#039;ACK tick&#061;12\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;13&#039;) sent&#061;b&#039;ACK tick&#061;13\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;14&#039;) sent&#061;b&#039;ACK tick&#061;14\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;15&#039;) sent&#061;b&#039;ACK tick&#061;15\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;16&#039;) sent&#061;b&#039;ACK tick&#061;16\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;17&#039;) sent&#061;b&#039;ACK tick&#061;17\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;18&#039;) sent&#061;b&#039;ACK tick&#061;18\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;19&#039;) sent&#061;b&#039;ACK tick&#061;19\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;20&#039;) sent&#061;b&#039;ACK tick&#061;20\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;21&#039;) sent&#061;b&#039;ACK tick&#061;21\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;22&#039;) sent&#061;b&#039;ACK tick&#061;22\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;23&#039;) sent&#061;b&#039;ACK tick&#061;23\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;24&#039;) sent&#061;b&#039;ACK tick&#061;24\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;25&#039;) sent&#061;b&#039;ACK tick&#061;25\\\\n&#039;<br \/>\nreceived&#061;bytearray(b&#039;tick&#061;26&#039;) sent&#061;b&#039;ACK tick&#061;26\\\\n&#039;<\/p>\n<p>\u4e3b\u673a\u7aef\u5904\u7406\u4e86 tick&#061;0 \u81f3 tick&#061;26 \u5171 27 \u884c\u8bf7\u6c42\u5e76\u53d1\u9001\u76f8\u5e94 ACK\u3002QEMU \u7aef\u672c\u8f6e\u63d0\u4f9b\u7684\u8f93\u51fa\u53ea\u8986\u76d6\u5230 tick&#061;8&#xff1b;\u7531\u4e8e\u4e24\u7aef\u8bb0\u5f55\u622a\u53d6\u65f6\u70b9\u4e0d\u540c&#xff0c;\u4e0d\u636e\u6b64\u58f0\u79f0\u5ba2\u6237\u7aef\u65e5\u5fd7\u5df2\u786e\u8ba4\u8bfb\u53d6 tick&#061;9 \u4e4b\u540e\u7684\u6bcf\u4e00\u6761\u54cd\u5e94\u3002127.0.0.1 \u662f QEMU user-mode \u7f51\u7edc\u8f6c\u63a5\u540e\u4e3b\u673a\u7aef\u770b\u5230\u7684\u6765\u6e90\u5730\u5740&#xff0c;37286 \u662f\u4e34\u65f6\u6e90\u7aef\u53e3&#xff0c;\u4e0d\u662f\u76d1\u542c\u7aef\u53e3\u3002<\/p>\n<h4>2. \u9a8c\u8bc1\u65ad\u7ebf\u540e\u91cd\u8fde<\/h4>\n<p>\u5148\u5728 QEMU \u76ee\u6807\u7aef&#xff08;\u7ec8\u7aef B&#xff09; \u6267\u884c pidof debug_demo&#xff0c;\u8bb0\u5f55\u505c\u670d\u524d\u7684 PID\u3002\u7136\u540e\u5728 Ubuntu \u4e3b\u673a\u7ec8\u7aef A \u6309 Ctrl&#043;C \u505c\u6b62 Python \u670d\u52a1&#xff0c;\u4e0d\u8981\u5728\u8fd0\u884c QEMU \u7684\u7ec8\u7aef B \u4e2d\u64cd\u4f5c\u3002\u7ec8\u7aef A \u8fd4\u56de\u4e3b\u673a shell \u63d0\u793a\u7b26\u540e&#xff0c;\u8868\u793a\u524d\u53f0\u670d\u52a1\u5df2\u9000\u51fa&#xff1b;Python \u53ef\u80fd\u540c\u65f6\u6253\u5370 KeyboardInterrupt&#xff0c;\u8fd9\u662f\u672c\u6b21\u4e3b\u52a8\u4e2d\u65ad\u4ea7\u751f\u7684\u63d0\u793a\u3002\u5ba2\u6237\u7aef\u4e0b\u4e00\u6b21\u6536\u53d1\u5e94\u9047\u5230 EOF\u3001\u8d85\u65f6\u6216 socket \u9519\u8bef&#xff0c;\u8bb0\u5f55\u65ad\u5f00\u5e76\u8fdb\u5165\u9000\u907f\u91cd\u8bd5\u3002<\/p>\n<p>\u4ee3\u7801\u4e2d\u7684\u91cd\u8bd5\u7b49\u5f85\u4f9d\u6b21\u4e3a 1\u30012\u30014\u30018 \u79d2&#xff0c;\u8fbe\u5230 8 \u79d2\u540e\u4fdd\u6301\u4e0a\u9650&#xff0c;\u4ee5\u907f\u514d\u7acb\u5373\u53cd\u590d\u91cd\u8bd5\u3002\u8fde\u63a5\u8c03\u7528\u81ea\u8eab\u7684\u8017\u65f6\u8fd8\u4f1a\u5f71\u54cd\u4e24\u6b21\u5c1d\u8bd5\u4e4b\u95f4\u7684\u5b9e\u9645\u95f4\u9694&#xff0c;\u4e0d\u80fd\u4ec5\u51ed\u7b49\u5f85\u53c2\u6570\u65ad\u8a00\u7cbe\u786e\u7684\u91cd\u8bd5\u5468\u671f\u6216 CPU \u5360\u7528\u3002<\/p>\n<p>\u4e3b\u673a\u670d\u52a1\u4fdd\u6301\u505c\u6b62\u65f6&#xff0c;\u53ca\u65f6\u5728 QEMU \u76ee\u6807\u7aef&#xff08;\u7ec8\u7aef B&#xff09; \u67e5\u770b\u91cd\u8bd5\u65e5\u5fd7&#xff1a;<\/p>\n<p><span class=\"token function\">tail<\/span> <span class=\"token parameter variable\">-n<\/span> <span class=\"token number\">20<\/span> \/var\/log\/debug-demo\/debug-demo.log<br \/>\n<span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-H<\/span> <span class=\"token parameter variable\">-E<\/span> <span class=\"token string\">&#039;tcp: (peer closed|send failed|receive failed|connect failed|retry in)&#039;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n    \/var\/log\/debug-demo\/debug-demo.log*<\/p>\n<p>\u5728\u4e3b\u52a8\u505c\u670d\u7684\u524d\u63d0\u4e0b&#xff0c;Connection refused \u662f\u9884\u671f\u73b0\u8c61&#xff0c;\u4e0d\u8868\u793a\u9700\u8981\u91cd\u5efa\u955c\u50cf\u3002\u65e5\u5fd7\u6ca1\u6709\u65f6\u95f4\u6233&#xff0c;\u56e0\u6b64\u53ea\u80fd\u6839\u636e\u65e5\u5fd7\u4e2d\u7684\u7b49\u5f85\u53c2\u6570\u5224\u65ad\u9000\u907f\u72b6\u6001&#xff0c;\u4e0d\u80fd\u6d4b\u91cf\u5b9e\u9645\u7b49\u5f85\u65f6\u957f\u3002<\/p>\n<p>\u672c\u8f6e\u4fee\u8ba2\u7248\u5ba2\u6237\u7aef&#xff08;PID 121&#xff09;\u7684\u5b9e\u9645\u8f93\u51fa\u5982\u4e0b&#xff1a;<\/p>\n<p># tail -n 20 \/var\/log\/debug-demo\/debug-demo.log<br \/>\ndebug-demo log: rotation complete; active file reopened pid&#061;121<br \/>\ntcp: sent&#061;tick&#061;99 received&#061;ACK tick&#061;99<br \/>\ntcp: sent&#061;tick&#061;100 received&#061;ACK tick&#061;100<br \/>\ntcp: peer closed connection<br \/>\ntcp: retry in 1 second(s)<br \/>\ntcp: connect failed host&#061;10.0.2.2 port&#061;5000 error&#061;Connection refused<br \/>\ntcp: retry in 2 second(s)<br \/>\n# grep -H -E &#039;tcp: (peer closed|send failed|receive failed|connect failed|retry in)&#039; \\\\<br \/>\n&gt;     \/var\/log\/debug-demo\/debug-demo.log*<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: peer closed connection<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: retry in 1 second(s)<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: connect failed host&#061;10.0.2.2 port&#061;5000 error&#061;Connection refused<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: retry in 2 second(s)<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: connect failed host&#061;10.0.2.2 port&#061;5000 error&#061;Connection refused<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: retry in 4 second(s)<\/p>\n<p>\u672c\u8f6e\u8bb0\u5f55\u786e\u8ba4\u8fde\u63a5\u5173\u95ed\u540e&#xff0c;\u5ba2\u6237\u7aef\u5148\u8bb0\u5f55 1 \u79d2\u7b49\u5f85&#xff1b;\u8fde\u63a5\u88ab\u62d2\u7edd\u540e&#xff0c;\u7b49\u5f85\u53c2\u6570\u9012\u589e\u5230 2 \u79d2&#xff0c;\u518d\u9012\u589e\u5230 4 \u79d2\u3002tail \u4e0e\u7a0d\u540e\u7684 grep \u662f\u4e0d\u540c\u65f6\u95f4\u70b9\u53d6\u5f97\u7684\u8f93\u51fa&#xff0c;\u56e0\u6b64 tail \u5c1a\u672a\u663e\u793a\u7684 4 \u79d2\u8bb0\u5f55\u51fa\u73b0\u5728\u68c0\u7d22\u7ed3\u679c\u4e2d\u5e76\u4e0d\u77db\u76fe\u3002\u6b64\u5904\u622a\u53d6\u5c1a\u672a\u663e\u793a 8 \u79d2&#xff1b;\u540e\u9762\u7684\u672c\u8f6e\u6062\u590d\u8bb0\u5f55\u663e\u793a\u5ba2\u6237\u7aef\u8fbe\u5230 8 \u79d2\u4e0a\u9650\u3002\u6240\u6709\u8f93\u51fa\u90fd\u6ca1\u6709\u65f6\u95f4\u6233&#xff0c;\u56e0\u6b64\u53ea\u80fd\u786e\u8ba4\u9000\u907f\u53c2\u6570\u5e8f\u5217&#xff0c;\u4e0d\u80fd\u6d4b\u91cf\u5b9e\u9645\u7b49\u5f85\u65f6\u957f\u3002<\/p>\n<p>\u65e5\u5fd7\u4ec5\u4fdd\u7559\u4e00\u4efd\u8f6e\u8f6c\u5907\u4efd&#xff0c;\u5e94\u53ca\u65f6\u8bb0\u5f55\u8f93\u51fa\u3002\u901a\u914d\u7b26\u68c0\u7d22\u6309\u6587\u4ef6\u987a\u5e8f\u8f93\u51fa&#xff0c;\u4e0d\u662f\u6309\u65f6\u95f4\u5408\u5e76&#xff1b;\u8bfb\u53d6\u671f\u95f4\u4ecd\u53ef\u80fd\u5199\u5165\u548c\u8f6e\u8f6c&#xff0c;\u4e0d\u80fd\u4ec5\u51ed\u7f3a\u5c11\u67d0\u4e00\u884c\u5224\u65ad\u8bf7\u6c42\u4e22\u5931\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\u5728 Ubuntu \u4e3b\u673a\u7ec8\u7aef A \u91cd\u65b0\u6267\u884c\u7b2c\u56db\u8282\u7684\u5b8c\u6574 Python \u547d\u4ee4&#xff0c;\u4fdd\u6301\u670d\u52a1\u8fd0\u884c&#xff1b;\u65e0\u9700\u91cd\u542f QEMU&#xff0c;\u4e5f\u4e0d\u8981\u624b\u5de5\u542f\u52a8\u53e6\u4e00\u4e2a\u5ba2\u6237\u7aef\u3002\u5728 QEMU \u76ee\u6807\u7aef&#xff08;\u7ec8\u7aef B&#xff09; \u6267\u884c&#xff1a;<\/p>\n<p>pidof debug_demo<br \/>\n<span class=\"token function\">tail<\/span> <span class=\"token parameter variable\">-n<\/span> <span class=\"token number\">20<\/span> \/var\/log\/debug-demo\/debug-demo.log<\/p>\n<p>\u82e5\u5ba2\u6237\u7aef\u4ecd\u5904\u4e8e\u9000\u907f\u7b49\u5f85&#xff0c;\u4e0d\u4e00\u5b9a\u7acb\u523b\u51fa\u73b0\u65b0\u8fde\u63a5&#xff1b;\u7a0d\u540e\u518d\u6b21\u67e5\u770b\u3002\u9884\u671f\u5e94\u91cd\u65b0\u51fa\u73b0 tcp: connected \u548c sent&#061;&#8230; received&#061;&#8230;&#xff0c;\u5e76\u68c0\u67e5 PID \u662f\u5426\u4e0e\u505c\u670d\u524d\u4e00\u81f4\u3002\u6062\u590d\u540e\u53ca\u65f6\u8bb0\u5f55\u8f93\u51fa&#xff0c;\u907f\u514d\u88ab\u8f6e\u8f6c\u8986\u76d6\u3002<\/p>\n<p>\u8bf7\u6c42\u5e8f\u53f7\u5728\u65ad\u7ebf\u540e\u7ee7\u7eed\u9012\u589e&#xff0c;\u7b26\u5408\u5ba2\u6237\u7aef\u4fdd\u7559\u8fdb\u7a0b\u5185\u8ba1\u6570\u7684\u5b9e\u73b0\u3002\u65e5\u5fd7\u672a\u5c55\u793a\u7684\u4e2d\u95f4\u5e8f\u53f7\u4e0d\u662f\u4e22\u5305\u8bc1\u636e\u3002\u8be5\u6d4b\u8bd5\u9a8c\u8bc1 TCP \u8fde\u63a5\u6062\u590d&#xff0c;\u4e0d\u4fdd\u8bc1\u672a\u786e\u8ba4\u8bf7\u6c42\u662f\u5426\u5df2\u88ab\u6267\u884c&#xff0c;\u4e5f\u4e0d\u8bc1\u660e\u8bf7\u6c42\u6070\u597d\u6267\u884c\u4e00\u6b21\u3002<\/p>\n<p>\u672c\u8f6e\u4fee\u8ba2\u7248\u5ba2\u6237\u7aef\u6062\u590d\u4e3b\u673a\u670d\u52a1\u540e\u7684\u5b9e\u9645\u8f93\u51fa\u5982\u4e0b&#xff1a;<\/p>\n<p># pidof debug_demo<br \/>\n121<br \/>\n# tail -n 20 \/var\/log\/debug-demo\/debug-demo.log<br \/>\ndebug-demo log: rotation complete; active file reopened pid&#061;121<br \/>\ntcp: retry in 8 second(s)<br \/>\ntcp: connect failed host&#061;10.0.2.2 port&#061;5000 error&#061;Connection refused<br \/>\ntcp: retry in 8 second(s)<br \/>\ntcp: connect failed host&#061;10.0.2.2 port&#061;5000 error&#061;Connection refused<br \/>\ntcp: retry in 8 second(s)<br \/>\ntcp: connect failed host&#061;10.0.2.2 port&#061;5000 error&#061;Connection refused<br \/>\ntcp: retry in 8 second(s)<br \/>\ntcp: connect failed host&#061;10.0.2.2 port&#061;5000 error&#061;Connection refused<br \/>\ntcp: retry in 8 second(s)<br \/>\ntcp: connected host&#061;10.0.2.2 port&#061;5000<br \/>\ntcp: sent&#061;tick&#061;101 received&#061;ACK tick&#061;101<br \/>\ntcp: sent&#061;tick&#061;102 received&#061;ACK tick&#061;102<br \/>\ntcp: sent&#061;tick&#061;103 received&#061;ACK tick&#061;103<br \/>\ntcp: sent&#061;tick&#061;104 received&#061;ACK tick&#061;104<br \/>\ntcp: sent&#061;tick&#061;105 received&#061;ACK tick&#061;105<br \/>\ntcp: sent&#061;tick&#061;106 received&#061;ACK tick&#061;106<\/p>\n<p>\u672c\u8f6e\u5ba2\u6237\u7aef\u5728\u591a\u6b21 Connection refused \u540e\u4ecd\u4e3a PID 121&#xff0c;\u8bb0\u5f55\u4e86 8 \u79d2\u4e0a\u9650\u7b49\u5f85&#xff0c;\u968f\u540e\u91cd\u65b0\u8fde\u63a5\u5e76\u5b8c\u6210 tick&#061;101 \u81f3 tick&#061;106 \u5171 6 \u6b21\u8bf7\u6c42\/\u54cd\u5e94\u3002\u56e0\u6b64&#xff0c;\u672c\u8f6e\u201c\u540c\u4e00\u8fdb\u7a0b\u5728\u4e3b\u673a\u670d\u52a1\u6062\u590d\u540e\u81ea\u52a8\u91cd\u8fde\u5e76\u6062\u590d\u6536\u53d1\u201d\u5df2\u9a8c\u8bc1\u3002\u7ed3\u5408\u6b64\u524d\u672c\u8f6e\u65e5\u5fd7\u4e2d\u8bb0\u5f55\u7684 1\u30012\u30014 \u79d2\u53c2\u6570&#xff0c;\u53ef\u786e\u8ba4\u65e5\u5fd7\u8986\u76d6\u4e86\u9000\u907f\u589e\u957f\u81f3 8 \u79d2\u4e0a\u9650&#xff1b;\u8fd9\u4e9b\u65e5\u5fd7\u6ca1\u6709\u65f6\u95f4\u6233&#xff0c;\u4e0d\u80fd\u636e\u6b64\u6d4b\u91cf\u5b9e\u9645\u7b49\u5f85\u65f6\u957f\u3002<\/p>\n<h4>3. \u9a8c\u8bc1\u670d\u52a1\u4ecd\u7531 init \u76d1\u7763<\/h4>\n<p>\u672c\u8282\u9a8c\u8bc1\u201c\u8fdb\u7a0b\u9000\u51fa\u540e\u7531 init \u542f\u52a8\u65b0\u8fdb\u7a0b\u201d&#xff0c;\u4e0e\u4e0a\u4e00\u8282\u201c\u540c\u4e00\u8fdb\u7a0b\u91cd\u8fde TCP\u201d\u4e0d\u540c\u3002\u4fdd\u6301 Ubuntu \u4e3b\u673a\u7ec8\u7aef A \u7684 Python \u670d\u52a1\u8fd0\u884c&#xff1b;\u4ee5\u4e0b\u547d\u4ee4\u5168\u90e8\u5728 QEMU \u76ee\u6807\u7aef&#xff08;\u7ec8\u7aef B&#xff09; \u7684\u540c\u4e00\u4e2a shell \u4e2d\u6267\u884c\u3002\u4e0d\u8981\u91cd\u542f QEMU&#xff0c;\u4e5f\u4e0d\u8981\u624b\u5de5\u542f\u52a8\u53e6\u4e00\u4e2a\u5ba2\u6237\u7aef\u3002<\/p>\n<p>\u7b2c\u4e00\u6b65&#xff1a;\u8bb0\u5f55\u5f53\u524d PID\u3002<\/p>\n<p><span class=\"token assign-left variable\">old_pid<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span>pidof debug_demo<span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$old_pid<\/span>&#034;<\/span><\/p>\n<p>\u5e94\u53ea\u8f93\u51fa\u4e00\u4e2a\u6b63\u6574\u6570\u3002\u82e5\u6ca1\u6709\u8f93\u51fa\u6216\u6709\u591a\u4e2a PID&#xff0c;\u5148\u505c\u6b62\u672c\u8282\u64cd\u4f5c\u5e76\u68c0\u67e5\u670d\u52a1\u72b6\u6001&#xff0c;\u4e0d\u8981\u7ee7\u7eed\u53d1\u9001\u4fe1\u53f7\u3002\u5c06\u5b9e\u9645\u8f93\u51fa\u4f5c\u4e3a old_pid&#xff0c;\u4e0d\u8981\u5047\u8bbe PID \u56fa\u5b9a\u3002<\/p>\n<p>\u672c\u8f6e\u7b2c\u4e00\u6b65\u7684\u5b9e\u9645\u8f93\u51fa\u4e3a&#xff1a;<\/p>\n<p># old_pid&#061;$(pidof debug_demo)<br \/>\n# echo &#034;$old_pid&#034;<br \/>\n121<\/p>\n<p>\u5f53\u524d\u53ea\u67e5\u8be2\u5230\u4e00\u4e2a\u670d\u52a1 PID 121\u3002\u8fd9\u662f SIGTERM \u524d\u7684\u57fa\u7ebf&#xff1b;\u4ecd\u9700\u6267\u884c\u540e\u7eed\u6b65\u9aa4&#xff0c;\u624d\u80fd\u9a8c\u8bc1 BusyBox init \u662f\u5426\u542f\u52a8\u4e86\u65b0\u8fdb\u7a0b\u3002<\/p>\n<p>\u7b2c\u4e8c\u6b65&#xff1a;\u53d1\u9001 SIGTERM&#xff0c;\u8ba9 init \u81ea\u52a8\u91cd\u542f\u670d\u52a1\u3002<\/p>\n<p><span class=\"token function\">kill<\/span> <span class=\"token parameter variable\">-TERM<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$old_pid<\/span>&#034;<\/span><\/p>\n<p>\u6210\u529f\u53d1\u9001\u4fe1\u53f7\u65f6\u901a\u5e38\u6ca1\u6709\u8f93\u51fa&#xff0c;\u8fd9\u4e0d\u7b49\u4e8e\u65b0\u8fdb\u7a0b\u5df2\u7ecf\u542f\u52a8\u3002\u7b49\u5f85\u51e0\u79d2\u540e\u67e5\u8be2&#xff1a;<\/p>\n<p>pidof debug_demo<\/p>\n<p>\u9884\u671f\u51fa\u73b0\u4e00\u4e2a\u4e0d\u540c\u4e8e\u65e7 PID \u7684\u65b0 PID\u3002\u82e5\u6682\u65f6\u6ca1\u6709\u8f93\u51fa&#xff0c;\u6216\u4ecd\u662f\u65e7 PID&#xff0c;\u7a0d\u540e\u518d\u6267\u884c\u8fd9\u6761\u67e5\u8be2&#xff1b;\u4e0d\u8981\u91cd\u590d\u53d1\u9001\u4fe1\u53f7&#xff0c;\u4e5f\u4e0d\u8981\u624b\u5de5\u542f\u52a8\u670d\u52a1\u3002\u82e5\u6301\u7eed\u6ca1\u6709\u65b0 PID&#xff0c;\u5e94\u5148\u68c0\u67e5\u65e5\u5fd7\u548c init \u914d\u7f6e&#xff0c;\u4e0d\u80fd\u7ee7\u7eed\u6309\u9a8c\u8bc1\u6210\u529f\u5904\u7406\u3002<\/p>\n<p>\u672c\u8f6e\u7b2c\u4e8c\u6b65\u7684\u5b9e\u9645\u8f93\u51fa\u4e3a&#xff1a;<\/p>\n<p># kill -TERM &#034;$old_pid&#034;<br \/>\n# pidof debug_demo<br \/>\n133<\/p>\n<p>\u67e5\u8be2\u8fd4\u56de\u7684\u65b0 PID 133 \u4e0e\u65e7 PID 121 \u4e0d\u540c&#xff0c;\u7b26\u5408 init \u62c9\u8d77\u65b0\u8fdb\u7a0b\u7684\u9884\u671f\u3002\u8fd8\u9700\u6267\u884c\u7b2c\u4e09\u6b65&#xff0c;\u6838\u9a8c\u65b0\u8fdb\u7a0b\u7684\u7236\u8fdb\u7a0b\u3001\u8eab\u4efd\u548c\u6536\u53d1\u72b6\u6001&#xff0c;\u4e0d\u80fd\u4ec5\u51ed PID \u53d8\u5316\u5224\u65ad\u672c\u8282\u5168\u90e8\u901a\u8fc7\u3002<\/p>\n<p>\u7b2c\u4e09\u6b65&#xff1a;\u6838\u9a8c\u65b0\u8fdb\u7a0b\u8eab\u4efd\u548c TCP \u6536\u53d1\u3002<\/p>\n<p>\u786e\u8ba4\u67e5\u8be2\u7ed3\u679c\u53ea\u6709\u4e00\u4e2a\u65b0 PID \u540e&#xff0c;\u6267\u884c&#xff1a;<\/p>\n<p><span class=\"token assign-left variable\">new_pid<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span>pidof debug_demo<span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token builtin class-name\">printf<\/span> <span class=\"token string\">&#039;old_pid&#061;%s new_pid&#061;%s\\\\n&#039;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$old_pid<\/span>&#034;<\/span> <span class=\"token string\">&#034;<span class=\"token variable\">$new_pid<\/span>&#034;<\/span><br \/>\n<span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-E<\/span> <span class=\"token string\">&#039;^(Name|PPid|Uid|Gid|Groups):&#039;<\/span> <span class=\"token string\">&#034;\/proc\/<span class=\"token variable\">$new_pid<\/span>\/status&#034;<\/span><br \/>\n<span class=\"token function\">tail<\/span> <span class=\"token parameter variable\">-n<\/span> <span class=\"token number\">20<\/span> \/var\/log\/debug-demo\/debug-demo.log<\/p>\n<p>\u672c\u8f6e\u7b2c\u4e09\u6b65\u7684\u5b9e\u9645\u8f93\u51fa\u4e3a&#xff1a;<\/p>\n<p># new_pid&#061;$(pidof debug_demo)<br \/>\n# printf &#039;old_pid&#061;%s new_pid&#061;%s\\\\n&#039; &#034;$old_pid&#034; &#034;$new_pid&#034;<br \/>\nold_pid&#061;121 new_pid&#061;133<br \/>\n# grep -E &#039;^(Name|PPid|Uid|Gid|Groups):&#039; &#034;\/proc\/$new_pid\/status&#034;<br \/>\nName:   debug_demo<br \/>\nPPid:   1<br \/>\nUid:    100     100     100     100<br \/>\nGid:    101     101     101     101<br \/>\nGroups:<br \/>\n# tail -n 20 \/var\/log\/debug-demo\/debug-demo.log<br \/>\ndebug-demo log: rotation complete; active file reopened pid&#061;133<br \/>\ntcp: sent&#061;tick&#061;12 received&#061;ACK tick&#061;12<br \/>\ntcp: sent&#061;tick&#061;13 received&#061;ACK tick&#061;13<br \/>\ntcp: sent&#061;tick&#061;14 received&#061;ACK tick&#061;14<br \/>\ntcp: sent&#061;tick&#061;15 received&#061;ACK tick&#061;15<br \/>\ntcp: sent&#061;tick&#061;16 received&#061;ACK tick&#061;16<br \/>\ntcp: sent&#061;tick&#061;17 received&#061;ACK tick&#061;17<br \/>\ntcp: sent&#061;tick&#061;18 received&#061;ACK tick&#061;18<br \/>\ntcp: sent&#061;tick&#061;19 received&#061;ACK tick&#061;19<br \/>\ntcp: sent&#061;tick&#061;20 received&#061;ACK tick&#061;20<br \/>\ntcp: sent&#061;tick&#061;21 received&#061;ACK tick&#061;21<br \/>\ntcp: sent&#061;tick&#061;22 received&#061;ACK tick&#061;22<\/p>\n<p>PID \u4ece 121 \u53d8\u4e3a 133&#xff1b;\u65b0\u8fdb\u7a0b\u7531 PID 1 \u76f4\u63a5\u542f\u52a8&#xff0c;\u56db\u4e2a UID \u5747\u4e3a 100\u3001\u56db\u4e2a GID \u5747\u4e3a 101&#xff0c;\u9644\u52a0\u7ec4\u4e3a\u7a7a\u3002\u4e0a\u9762\u7684\u8f6e\u8f6c\u8bb0\u5f55\u6807\u51fa pid&#061;133&#xff0c;\u5e76\u663e\u793a tick&#061;12 \u81f3 tick&#061;22 \u7684\u6536\u53d1\u3002<\/p>\n<p>\u968f\u540e\u68c0\u7d22\u5f53\u524d\u65e5\u5fd7\u548c\u8f6e\u8f6c\u5907\u4efd&#xff0c;\u627e\u5230\u65b0\u8fdb\u7a0b\u7684\u542f\u52a8\u3001\u8fde\u63a5\u4ee5\u53ca\u8f83\u65e9\u6536\u53d1\u8bb0\u5f55&#xff1a;<\/p>\n<p># grep -H -E &#039;debug-demo start:|tcp: connected|tcp: sent&#061;&#039; \\\\<br \/>\n&gt;     \/var\/log\/debug-demo\/debug-demo.log*<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;12 received&#061;ACK tick&#061;12<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;13 received&#061;ACK tick&#061;13<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;14 received&#061;ACK tick&#061;14<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;15 received&#061;ACK tick&#061;15<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;16 received&#061;ACK tick&#061;16<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;17 received&#061;ACK tick&#061;17<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;18 received&#061;ACK tick&#061;18<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;19 received&#061;ACK tick&#061;19<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;20 received&#061;ACK tick&#061;20<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;21 received&#061;ACK tick&#061;21<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;22 received&#061;ACK tick&#061;22<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;23 received&#061;ACK tick&#061;23<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;24 received&#061;ACK tick&#061;24<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;25 received&#061;ACK tick&#061;25<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;26 received&#061;ACK tick&#061;26<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;27 received&#061;ACK tick&#061;27<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;28 received&#061;ACK tick&#061;28<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;29 received&#061;ACK tick&#061;29<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;30 received&#061;ACK tick&#061;30<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;31 received&#061;ACK tick&#061;31<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;32 received&#061;ACK tick&#061;32<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;33 received&#061;ACK tick&#061;33<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;282 received&#061;ACK tick&#061;282<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;283 received&#061;ACK tick&#061;283<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;284 received&#061;ACK tick&#061;284<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;285 received&#061;ACK tick&#061;285<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;286 received&#061;ACK tick&#061;286<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;287 received&#061;ACK tick&#061;287<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;288 received&#061;ACK tick&#061;288<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;289 received&#061;ACK tick&#061;289<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;290 received&#061;ACK tick&#061;290<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:debug-demo start: pid&#061;133 uid&#061;100 gid&#061;101 config&#061;loaded interval_sec&#061;2<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: connected host&#061;10.0.2.2 port&#061;5000<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;0 received&#061;ACK tick&#061;0<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;1 received&#061;ACK tick&#061;1<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;2 received&#061;ACK tick&#061;2<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;3 received&#061;ACK tick&#061;3<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;4 received&#061;ACK tick&#061;4<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;5 received&#061;ACK tick&#061;5<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;6 received&#061;ACK tick&#061;6<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;7 received&#061;ACK tick&#061;7<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;8 received&#061;ACK tick&#061;8<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;9 received&#061;ACK tick&#061;9<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;10 received&#061;ACK tick&#061;10<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;11 received&#061;ACK tick&#061;11<\/p>\n<p>\u8f6e\u8f6c\u5907\u4efd\u786e\u8ba4 PID 133 \u542f\u52a8\u5e76\u8fde\u63a5\u6210\u529f&#xff0c;\u8bb0\u5f55\u4e86 tick&#061;0 \u81f3 tick&#061;11&#xff1b;\u5f53\u524d\u65e5\u5fd7\u7ee7\u7eed\u8bb0\u5f55 tick&#061;12 \u81f3 tick&#061;33\u3002\u5408\u8ba1\u53ef\u786e\u8ba4\u65b0\u8fdb\u7a0b\u5b8c\u6210 tick&#061;0 \u81f3 tick&#061;33 \u5171 34 \u6b21\u8bf7\u6c42\/\u54cd\u5e94\u3002\u547d\u4ee4\u6309\u6587\u4ef6\u5c55\u5f00\u987a\u5e8f\u8f93\u51fa&#xff0c;\u5148\u5217\u5f53\u524d\u65e5\u5fd7\u518d\u5217 .1 \u5907\u4efd&#xff0c;\u5e76\u975e\u6309\u65f6\u95f4\u6392\u5e8f&#xff1b;\u56e0\u6b64\u5148\u770b\u5230 tick&#061;12\u3001\u518d\u770b\u5230\u542f\u52a8\u884c\u548c tick&#061;0 \u4e0d\u4ee3\u8868\u5e8f\u53f7\u5012\u9000\u3002\u7ed3\u5408\u65b0\u65e7 PID\u3001PPid&#061;1 \u548c\u8eab\u4efd\u4fe1\u606f&#xff0c;\u672c\u8f6e init respawn \u53ca\u65b0\u8fdb\u7a0b\u6062\u590d\u6536\u53d1\u9a8c\u8bc1\u901a\u8fc7\u3002<\/p>\n<p>\u4e4b\u540e\u518d\u6b21\u68c0\u7d22\u65e5\u5fd7&#xff0c;\u770b\u5230\u5f53\u524d\u6587\u4ef6\u6709 tick&#061;87 \u81f3 tick&#061;98&#xff0c;\u8f6e\u8f6c\u5907\u4efd\u6709 tick&#061;62 \u81f3 tick&#061;86&#xff1b;\u4e2d\u95f4\u8fde\u7eed\u884c\u7701\u7565\u5982\u4e0b&#xff1a;<\/p>\n<p>\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;87 received&#061;ACK tick&#061;87<br \/>\n&#8230;<br \/>\n\/var\/log\/debug-demo\/debug-demo.log:tcp: sent&#061;tick&#061;98 received&#061;ACK tick&#061;98<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;62 received&#061;ACK tick&#061;62<br \/>\n&#8230;<br \/>\n\/var\/log\/debug-demo\/debug-demo.log.1:tcp: sent&#061;tick&#061;86 received&#061;ACK tick&#061;86<\/p>\n<p>\u8fd9\u6b21\u68c0\u7d22\u6ca1\u6709\u627e\u5230 debug-demo start: \u6216 tcp: connected&#xff0c;\u8bf4\u660e\u8fd9\u4e9b\u884c\u5df2\u4e0d\u5728\u5f53\u524d\u4e24\u4efd\u4fdd\u7559\u65e5\u5fd7\u4e2d&#xff1b;\u6b64\u524d\u6355\u83b7\u7684 PID 133 \u542f\u52a8\u4e0e\u8fde\u63a5\u8bb0\u5f55\u4ecd\u662f\u672c\u8f6e\u5df2\u6709\u8bc1\u636e\u3002\u6b64\u6b21 grep \u672a\u540c\u65f6\u67e5\u8be2 PID&#xff0c;\u56e0\u6b64\u53ea\u636e\u6b64\u8bf4\u660e\u4fdd\u7559\u65e5\u5fd7\u4e2d\u7684 ACK \u6536\u53d1\u5df2\u5230 tick&#061;98&#xff0c;\u4e0d\u5355\u72ec\u7528\u5b83\u63a8\u65ad\u67e5\u8be2\u5f53\u65f6\u7684\u8fdb\u7a0b\u8eab\u4efd\u3002\u6587\u4ef6\u53c2\u6570\u987a\u5e8f\u662f\u5f53\u524d\u65e5\u5fd7\u5728\u524d\u3001.1 \u5728\u540e&#xff0c;\u4e0d\u80fd\u6309\u8f93\u51fa\u987a\u5e8f\u5224\u65ad tick \u5148\u540e&#xff1b;\u8f6e\u8f6c\u4e5f\u4f1a\u4f7f\u66f4\u65e9\u884c\u4e0d\u518d\u4fdd\u7559\u3002<\/p>\n<p>\u672c\u8282\u901a\u8fc7\u6807\u51c6\u5982\u4e0b&#xff0c;\u5747\u9700\u4ee5\u5b9e\u9645\u8f93\u51fa\u6838\u5bf9&#xff1a;<\/p>\n<ul>\n<li>\u65b0\u65e7 PID \u4e0d\u540c&#xff0c;\u4e14\u67e5\u8be2\u65f6\u53ea\u6709\u4e00\u4e2a\u670d\u52a1\u5b9e\u4f8b\u3002<\/li>\n<li>\u65b0\u8fdb\u7a0b\u7684 PPid \u4e3a 1&#xff0c;\u7b26\u5408\u672c\u6587\u7531 BusyBox init \u76f4\u63a5\u542f\u52a8\u670d\u52a1\u7684\u914d\u7f6e\u3002<\/li>\n<li>UID\/GID \u4ecd\u4e3a\u975e root \u670d\u52a1\u8d26\u6237&#xff0c;\u9644\u52a0\u7ec4\u4e3a\u7a7a&#xff1b;\u5177\u4f53\u6570\u503c\u4ee5\u76ee\u6807\u7cfb\u7edf\u8d26\u6237\u914d\u7f6e\u4e3a\u51c6\u3002<\/li>\n<li>\u65b0\u8fdb\u7a0b\u6062\u590d ACK \u6536\u53d1&#xff0c;\u5e76\u80fd\u901a\u8fc7\u5bf9\u5e94\u65b0 PID \u7684\u542f\u52a8\u6216\u8f6e\u8f6c\u8bb0\u5f55\u5173\u8054\u5230\u672c\u8f6e\u8fdb\u7a0b&#xff0c;\u4e0d\u80fd\u4ec5\u51ed\u65e7\u65e5\u5fd7\u5224\u5b9a\u6062\u590d\u3002<\/li>\n<\/ul>\n<p>\u65b0\u8fdb\u7a0b\u4e2d\u7684\u8bf7\u6c42\u8ba1\u6570\u4f1a\u4ece tick&#061;0 \u91cd\u65b0\u5f00\u59cb&#xff0c;\u8fd9\u662f\u8fdb\u7a0b\u5185\u72b6\u6001\u91cd\u65b0\u521d\u59cb\u5316\u7684\u6b63\u5e38\u73b0\u8c61&#xff0c;\u4e0d\u662f TCP \u91cd\u8fde\u5bfc\u81f4\u5e8f\u53f7\u6e05\u96f6\u3002\u82e5\u68c0\u67e5\u7a0d\u665a&#xff0c;\u5f53\u524d\u65e5\u5fd7\u53ef\u80fd\u53ea\u663e\u793a\u540e\u7eed\u5e8f\u53f7&#xff1b;\u542f\u52a8\u548c\u8fde\u63a5\u8bb0\u5f55\u4e5f\u53ef\u80fd\u5df2\u88ab\u8f6e\u8f6c&#xff0c;\u53ef\u53ca\u65f6\u67e5\u770b\u73b0\u5b58\u65e5\u5fd7&#xff1a;<\/p>\n<p><span class=\"token function\">grep<\/span> <span class=\"token parameter variable\">-H<\/span> <span class=\"token parameter variable\">-E<\/span> <span class=\"token string\">&#039;debug-demo start:|tcp: connected|tcp: sent&#061;&#039;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n    \/var\/log\/debug-demo\/debug-demo.log*<\/p>\n<p>\u6ce8\u610f\u533a\u5206\u672c\u8f6e\u65b0\u8fdb\u7a0b\u4e0e\u8f6e\u8f6c\u5907\u4efd\u4e2d\u7684\u65e7\u8bb0\u5f55\u3002\u82e5\u7ec8\u7aef A \u7684 Python \u670d\u52a1\u610f\u5916\u9000\u51fa&#xff0c;\u5148\u8bb0\u5f55\u62a5\u9519&#xff0c;\u518d\u6309\u7b2c\u56db\u8282\u6062\u590d\u4e3b\u673a\u670d\u52a1&#xff1b;\u5426\u5219\u65e0\u6cd5\u5b8c\u6210\u65b0\u8fdb\u7a0b\u6536\u53d1\u9a8c\u8bc1\u3002<\/p>\n<p>\u672c\u8f6e init \u91cd\u542f\u53ca\u65b0\u8fdb\u7a0b\u6062\u590d\u6536\u53d1\u9a8c\u8bc1\u5df2\u901a\u8fc7\u3002 \u5b9e\u6d4b\u652f\u6301\u65b0\u65e7 PID\u3001\u7236\u8fdb\u7a0b\u3001\u8eab\u4efd\u548c ACK \u6536\u53d1\u7ed3\u8bba&#xff1b;\u65e5\u5fd7\u8f6e\u8f6c\u9020\u6210\u7684\u672a\u5c55\u793a\u884c\u4e0d\u4f5c\u4e3a\u5b9e\u6d4b\u5185\u5bb9\u3002<\/p>\n<h3>\u5341\u3001\u5e38\u89c1\u95ee\u9898\u4e0e\u5b9e\u9a8c\u8fb9\u754c<\/h3>\n<table>\n<tr>\u73b0\u8c61\u68c0\u67e5\u65b9\u5411<\/tr>\n<tbody>\n<tr>\n<td>Connection refused<\/td>\n<td>\u4e3b\u673a\u6d4b\u8bd5\u670d\u52a1\u662f\u5426\u542f\u52a8\u3001\u7aef\u53e3\u662f\u5426\u4e00\u81f4\u3001\u4e3b\u673a\u9632\u706b\u5899\u89c4\u5219<\/td>\n<\/tr>\n<tr>\n<td>Network is unreachable<\/td>\n<td>QEMU \u662f\u5426\u4f7f\u7528 user-mode \u7f51\u7edc\u8bbe\u5907\u3001guest \u8def\u7531\u548c\u4e3b\u673a\u5730\u5740\u662f\u5426\u6b63\u786e<\/td>\n<\/tr>\n<tr>\n<td>TCP \u5df2\u8fde\u63a5\u4f46\u6ca1\u6709\u5b8c\u6574\u54cd\u5e94<\/td>\n<td>\u670d\u52a1\u7aef\u662f\u5426\u53d1\u9001\u6362\u884c\u7b26&#xff1b;\u5ba2\u6237\u7aef\u662f\u5426\u9047\u5230\u8d85\u65f6\u6216\u4e0d\u5b8c\u6574\u5e27<\/td>\n<\/tr>\n<tr>\n<td>\u6bcf\u6761\u54cd\u5e94\u524d\u540e\u5185\u5bb9\u9519\u4f4d<\/td>\n<td>\u68c0\u67e5\u5206\u5e27\u89c4\u5219\u3001\u7f13\u51b2\u533a\u957f\u5ea6\u548c\u662f\u5426\u9519\u8bef\u5730\u628a\u4e00\u6b21 recv() \u5f53\u6210\u4e00\u6761\u6d88\u606f<\/td>\n<\/tr>\n<tr>\n<td>\u670d\u52a1\u65ad\u7ebf\u540e\u4e0d\u505c\u5feb\u901f\u91cd\u8bd5<\/td>\n<td>\u68c0\u67e5\u9000\u907f\u8def\u5f84\u662f\u5426\u7ecf\u8fc7\u3001\u9519\u8bef\u5206\u652f\u662f\u5426\u9057\u6f0f\u7b49\u5f85<\/td>\n<\/tr>\n<tr>\n<td>\u65b0\u670d\u52a1\u7aef\u542f\u52a8\u540e\u5ba2\u6237\u7aef\u4ecd\u4e0d\u6062\u590d<\/td>\n<td>\u68c0\u67e5\u5ba2\u6237\u7aef\u662f\u5426\u5173\u95ed\u4e86\u65e7 socket\u3001\u662f\u5426\u4ecd\u5904\u4e8e\u8d85\u65f6\u7b49\u5f85&#xff0c;\u4ee5\u53ca\u670d\u52a1\u5668\u76d1\u542c\u7aef\u53e3<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u672c\u7bc7\u7528 TCP \u884c\u534f\u8bae\u6f14\u793a\u5d4c\u5165\u5f0f Linux \u5ba2\u6237\u7aef\u7684\u6536\u53d1\u3001\u5206\u5e27\u3001\u9519\u8bef\u5904\u7406\u548c\u91cd\u8fde\u3002\u5b83\u4e0d\u8986\u76d6\u4e8c\u8fdb\u5236\u534f\u8bae\u3001TLS\u3001\u8bc1\u4e66\u7ba1\u7406\u3001DNS \u914d\u7f6e\u3001IPv6\u3001\u5e76\u53d1\u3001\u591a\u8def\u590d\u7528\u6216\u5b9e\u65f6\u6027\u4fdd\u8bc1\u3002\u4e3b\u673a Python \u7a0b\u5e8f\u662f\u5b9e\u9a8c\u5bf9\u7aef&#xff0c;\u4e0d\u5e94\u76f4\u63a5\u4f5c\u4e3a\u4ea7\u54c1\u670d\u52a1\u90e8\u7f72\u3002<\/p>\n<h4>\u9a8c\u8bc1\u8303\u56f4<\/h4>\n<table>\n<tr>\u9879\u76ee\u5f53\u524d\u8bc1\u636e\u4e0e\u9650\u5236<\/tr>\n<tbody>\n<tr>\n<td>\u521d\u59cb\u975e root \u6536\u53d1<\/td>\n<td>PID 121&#xff0c;UID\/GID \u4e3a 100\/101&#xff0c;\u9644\u52a0\u7ec4\u4e3a\u7a7a&#xff1b;\u521d\u59cb\u8fd0\u884c\u65e5\u5fd7\u8282\u9009\u8bb0\u5f55 tick&#061;0 \u81f3 tick&#061;8 \u5171 9 \u6b21\u8bf7\u6c42\/\u54cd\u5e94<\/td>\n<\/tr>\n<tr>\n<td>init \u91cd\u542f\u540e\u6536\u53d1<\/td>\n<td>PID 133&#xff0c;PPid&#061;1&#xff0c;UID\/GID \u4e3a 100\/101&#xff0c;\u9644\u52a0\u7ec4\u4e3a\u7a7a&#xff1b;\u8f6e\u8f6c\u65e5\u5fd7\u8bb0\u5f55 tick&#061;0 \u81f3 tick&#061;33 \u5171 34 \u6b21\u8bf7\u6c42\/\u54cd\u5e94<\/td>\n<\/tr>\n<tr>\n<td>\u4e3b\u673a\u7aef\u6536\u53d1<\/td>\n<td>Python \u670d\u52a1\u8bb0\u5f55\u63a5\u6536 tick&#061;0 \u81f3 tick&#061;26 \u5e76\u53d1\u9001 ACK&#xff1b;\u4e24\u7aef\u622a\u53d6\u8303\u56f4\u548c\u65f6\u95f4\u70b9\u4e0d\u540c&#xff0c;\u4e0d\u636e\u6b64\u58f0\u79f0\u6bcf\u6761\u4e3b\u673a\u54cd\u5e94\u5747\u6709\u5bf9\u5e94\u7684\u5ba2\u6237\u7aef\u8bb0\u5f55<\/td>\n<\/tr>\n<tr>\n<td>\u505c\u670d\u540e\u81ea\u52a8\u91cd\u8fde<\/td>\n<td>\u672c\u8f6e PID 121 \u8bb0\u5f55\u4e86 peer close\u30011\u30012\u30014\u30018 \u79d2\u9000\u907f\u53c2\u6570&#xff1b;\u4e3b\u673a\u670d\u52a1\u6062\u590d\u540e\u91cd\u65b0\u8fde\u63a5\u5e76\u5b8c\u6210 tick&#061;101 \u81f3 tick&#061;106 \u7684 6 \u6b21\u8bf7\u6c42\/\u54cd\u5e94<\/td>\n<\/tr>\n<tr>\n<td>\u9000\u907f\u7b49\u5f85<\/td>\n<td>\u672c\u8f6e\u65e5\u5fd7\u8bb0\u5f55\u4e86 1\u30012\u30014\u30018 \u79d2\u53c2\u6570\u5e76\u8fbe\u5230\u4e0a\u9650&#xff1b;\u6ca1\u6709\u65f6\u95f4\u6233&#xff0c;\u672a\u6d4b\u91cf\u7cbe\u786e\u5b9e\u9645\u95f4\u9694<\/td>\n<\/tr>\n<tr>\n<td>Python \u8fde\u63a5\u5f02\u5e38\u5904\u7406<\/td>\n<td>\u4fee\u8ba2\u540e\u4ee3\u7801\u5df2\u901a\u8fc7\u672c\u5730\u6a21\u62df socket \u6d4b\u8bd5&#xff1a;\u63a5\u6536\u91cd\u7f6e\u3001\u53d1\u9001\u65ad\u7ba1\u540e\u63a5\u53d7\u4e0b\u4e00\u8fde\u63a5&#xff0c;\u5173\u95ed\u51fa\u9519\u8fde\u63a5&#xff0c;\u4fdd\u6301 Ctrl&#043;C \u9000\u51fa\u884c\u4e3a<\/td>\n<\/tr>\n<tr>\n<td>Python \u6b63\u5e38\u5206\u5e27<\/td>\n<td>\u672c\u5730\u6a21\u62df\u6d4b\u8bd5\u8986\u76d6\u4e86\u62c6\u5206\u8f93\u5165\u548c\u540c\u4e00\u7247\u6bb5\u4e2d\u7684\u4e24\u884c\u8bf7\u6c42&#xff0c;\u5747\u8fd4\u56de\u9884\u671f ACK&#xff1b;\u4e0d\u7b49\u4e8e ARM64 \u7aef\u5230\u7aef\u6d4b\u8bd5<\/td>\n<\/tr>\n<tr>\n<td>C \u65e5\u5fd7\u9519\u8bef\u5904\u7406<\/td>\n<td>\u672c\u8f6e\u8fd0\u884c\u8bb0\u5f55\u8986\u76d6\u6b63\u5e38\u65e5\u5fd7\u8def\u5f84&#xff1b;\u65e5\u5fd7\u5199\u5165\/\u8f6e\u8f6c\u5931\u8d25\u5206\u652f\u5c1a\u672a\u6545\u969c\u6ce8\u5165\u9a8c\u8bc1&#xff0c;\u4e14\u672a\u4fdd\u5b58\u6784\u5efa\u9000\u51fa\u7801<\/td>\n<\/tr>\n<tr>\n<td>\u4fee\u8ba2\u7248\u9a8c\u8bc1<\/td>\n<td>\u5df2\u8bb0\u5f55\u672c\u8f6e\u57fa\u672c\u6536\u53d1\u3001\u4e3b\u673a\u7aef\u6536\u53d1\u3001\u9000\u907f\u91cd\u8fde\u53ca init \u91cd\u542f&#xff1b;\u6784\u5efa\u9000\u51fa\u7801\u672a\u8bb0\u5f55&#xff0c;\u65e5\u5fd7\u9519\u8bef\u5206\u652f\u548c\u5176\u4ed6\u5f02\u5e38\u8fb9\u754c\u672a\u4e13\u9879\u6d4b\u8bd5<\/td>\n<\/tr>\n<tr>\n<td>\u5176\u4ed6\u5f02\u5e38\u8fb9\u754c<\/td>\n<td>C \u77ed\u5199\u3001\u8d85\u957f\u884c\u3001\u4e0d\u5b8c\u6574\u5e27\u3001\u6162\u901f\u54cd\u5e94\u548c\u603b\u65f6\u9650\u7b49\u5c1a\u672a\u8fdb\u884c\u4e13\u9879\u9a8c\u8bc1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>\u5341\u4e00\u3001\u5c0f\u7ed3<\/h3>\n<p>\u672c\u7bc7\u6cbf\u7528 Buildroot\u3001QEMU\u3001BusyBox init \u548c debug-demo \u975e\u7279\u6743\u670d\u52a1&#xff0c;\u628a\u672c\u5730\u65e5\u5fd7\u670d\u52a1\u6269\u5c55\u4e3a TCP \u5ba2\u6237\u7aef\u3002\u901a\u8fc7\u663e\u5f0f\u7684\u6362\u884c\u5206\u5e27\u3001\u5b8c\u6574\u53d1\u9001\u5faa\u73af\u3001\u8d85\u65f6\u5904\u7406\u548c\u6709\u4e0a\u9650\u7684\u91cd\u8fde\u9000\u907f&#xff0c;\u5c55\u793a\u4e86\u4ece\u201c\u80fd\u6536\u53d1\u201d\u5230\u201c\u80fd\u8bc6\u522b\u6d88\u606f\u5e76\u5904\u7406\u65ad\u7ebf\u201d\u7684\u57fa\u672c\u6f14\u8fdb\u3002<\/p>\n<p>\u672c\u8f6e\u57fa\u672c\u6536\u53d1\u56de\u5f52\u5df2\u8bb0\u5f55 PID 121 \u4ee5\u975e root \u8eab\u4efd\u8fde\u63a5\u4e3b\u673a&#xff0c;QEMU \u7aef\u5b8c\u6210\u5e76\u8bb0\u5f55 tick&#061;0 \u81f3 tick&#061;8 \u7684 9 \u6b21\u8bf7\u6c42\/\u54cd\u5e94&#xff1b;\u4e3b\u673a\u7aef\u8bb0\u5f55\u5904\u7406 tick&#061;0 \u81f3 tick&#061;26 \u5e76\u53d1\u9001\u5bf9\u5e94 ACK\u3002\u7531\u4e8e\u4e24\u7aef\u65e5\u5fd7\u622a\u53d6\u8303\u56f4\u4e0d\u540c&#xff0c;\u4e0d\u628a\u4e3b\u673a\u7aef tick&#061;9 \u4e4b\u540e\u7684 ACK \u5199\u6210\u5ba2\u6237\u7aef\u5df2\u786e\u8ba4\u3002\u4e3b\u673a\u505c\u670d\u540e&#xff0c;\u672c\u8f6e\u65e5\u5fd7\u663e\u793a peer closed \u548c 1\u30012\u30014\u30018 \u79d2\u9000\u907f\u53c2\u6570&#xff1b;\u670d\u52a1\u6062\u590d\u540e&#xff0c;\u540c\u4e00 PID 121 \u81ea\u52a8\u91cd\u8fde\u5e76\u5b8c\u6210 tick&#061;101 \u81f3 tick&#061;106 \u7684 6 \u6b21\u8bf7\u6c42\/\u54cd\u5e94\u3002\u968f\u540e SIGTERM \u4f7f PID \u4ece 121 \u53d8\u4e3a 133&#xff1b;\u65b0\u8fdb\u7a0b\u7531 PID 1 \u542f\u52a8&#xff0c;\u4fdd\u6301\u975e root \u6743\u9650&#xff0c;\u5e76\u4ece tick&#061;0 \u8fde\u7eed\u6536\u53d1\u81f3 tick&#061;33\u3002\u6784\u5efa\u9000\u51fa\u7801\u672a\u8bb0\u5f55&#xff0c;\u65e5\u5fd7\u9519\u8bef\u5206\u652f\u53ca\u5176\u4ed6\u672a\u6d4b\u5f02\u5e38\u4ecd\u5f85\u9a8c\u8bc1\u3002<\/p>\n<p>\u8fd9\u4e9b\u8bb0\u5f55\u652f\u6301\u672c\u8f6e\u57fa\u672c\u6536\u53d1\u3001\u4e3b\u673a\u505c\u670d\u540e\u7684\u9000\u907f\u3001\u540c\u4e00\u8fdb\u7a0b\u81ea\u52a8\u91cd\u8fde&#xff0c;\u4ee5\u53ca init \u62c9\u8d77\u65b0\u8fdb\u7a0b\u540e\u7684\u8eab\u4efd\u548c\u6536\u53d1&#xff0c;\u4e0d\u4ee3\u8868\u5ba2\u6237\u7aef\u5df2\u5177\u5907\u751f\u4ea7\u7ea7\u53ef\u9760\u6027\u3002\u6784\u5efa\u9000\u51fa\u7801\u672a\u8bb0\u5f55&#xff1b;\u65e5\u5fd7\u9519\u8bef\u5206\u652f\u53ca\u5176\u4ed6\u672a\u6d4b\u9879\u76ee\u6309\u4e0a\u8868\u4fdd\u7559\u4e3a\u5b9e\u9a8c\u8fb9\u754c\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8ba9 Buildroot \u670d\u52a1\u5148\u5b8c\u6210 TCP \u6536\u53d1&#xff0c;\u518d\u5904\u7406\u6d88\u606f\u8fb9\u754c\u3001\u65ad\u7ebf\u4e0e\u91cd\u8fde<br \/>\n\u4e0a\u4e00\u7bc7\u4e3a debug-demo \u670d\u52a1\u521b\u5efa\u4e86\u4e13\u7528\u8d26\u6237&#xff0c;\u5e76\u5728 QEMU \u4e2d\u9a8c\u8bc1\u4e86\u964d\u6743\u540e\u7684\u670d\u52a1\u4ecd\u80fd\u5199\u65e5\u5fd7\u3001\u540c\u65f6\u65e0\u6cd5\u8bfb\u53d6 root-only \u6d4b\u8bd5\u6587\u4ef6\u3002\u8fd9\u7bc7\u6cbf\u7528\u540c\u4e00\u5957 Ubuntu\u3001Buildroot \u548c QEMU \u73af\u5883&#xff0c;\u8ba9\u8fd9\u4e2a\u524d\u53f0\u670d\u52a1\u518d\u589e\u52a0\u4e00\u9879\u80fd\u529b&#xff1a;\u8fde\u63a5 Ubuntu \u4e3b\u673a\u4e0a\u7684\u6d4b\u8bd5\u670d\u52a1&#xff0c;\u5468\u671f\u6027\u53d1\u9001\u4e00\u884c\u8bf7\u6c42\u5e76\u63a5\u6536\u4e00\u884c\u54cd\u5e94\u3002<br \/>\n\u672c\u6587\u5148\u8ba9\u6700\u5c0f\u6536<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[205,78,191],"topic":[],"class_list":["post-119700","post","type-post","status-publish","format-standard","hentry","category-server","tag-tcp-ip","tag-78","tag-191"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u8ba9 Buildroot \u670d\u52a1\u5148\u5b8c\u6210 TCP \u6536\u53d1\uff0c\u518d\u5904\u7406\u6d88\u606f\u8fb9\u754c\u3001\u65ad\u7ebf\u4e0e\u91cd\u8fde - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/119700.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u8ba9 Buildroot \u670d\u52a1\u5148\u5b8c\u6210 TCP \u6536\u53d1\uff0c\u518d\u5904\u7406\u6d88\u606f\u8fb9\u754c\u3001\u65ad\u7ebf\u4e0e\u91cd\u8fde - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u8ba9 Buildroot \u670d\u52a1\u5148\u5b8c\u6210 TCP \u6536\u53d1&#xff0c;\u518d\u5904\u7406\u6d88\u606f\u8fb9\u754c\u3001\u65ad\u7ebf\u4e0e\u91cd\u8fde \u4e0a\u4e00\u7bc7\u4e3a debug-demo \u670d\u52a1\u521b\u5efa\u4e86\u4e13\u7528\u8d26\u6237&#xff0c;\u5e76\u5728 QEMU \u4e2d\u9a8c\u8bc1\u4e86\u964d\u6743\u540e\u7684\u670d\u52a1\u4ecd\u80fd\u5199\u65e5\u5fd7\u3001\u540c\u65f6\u65e0\u6cd5\u8bfb\u53d6 root-only \u6d4b\u8bd5\u6587\u4ef6\u3002\u8fd9\u7bc7\u6cbf\u7528\u540c\u4e00\u5957 Ubuntu\u3001Buildroot \u548c QEMU \u73af\u5883&#xff0c;\u8ba9\u8fd9\u4e2a\u524d\u53f0\u670d\u52a1\u518d\u589e\u52a0\u4e00\u9879\u80fd\u529b&#xff1a;\u8fde\u63a5 Ubuntu \u4e3b\u673a\u4e0a\u7684\u6d4b\u8bd5\u670d\u52a1&#xff0c;\u5468\u671f\u6027\u53d1\u9001\u4e00\u884c\u8bf7\u6c42\u5e76\u63a5\u6536\u4e00\u884c\u54cd\u5e94\u3002 \u672c\u6587\u5148\u8ba9\u6700\u5c0f\u6536\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/119700.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-29T23:40:36+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/119700.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/119700.html\",\"name\":\"\u8ba9 Buildroot \u670d\u52a1\u5148\u5b8c\u6210 TCP \u6536\u53d1\uff0c\u518d\u5904\u7406\u6d88\u606f\u8fb9\u754c\u3001\u65ad\u7ebf\u4e0e\u91cd\u8fde - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-10-29T23:40:36+00:00\",\"dateModified\":\"2026-10-29T23:40:36+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/119700.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/119700.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/119700.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u8ba9 Buildroot \u670d\u52a1\u5148\u5b8c\u6210 TCP \u6536\u53d1\uff0c\u518d\u5904\u7406\u6d88\u606f\u8fb9\u754c\u3001\u65ad\u7ebf\u4e0e\u91cd\u8fde\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u8ba9 Buildroot \u670d\u52a1\u5148\u5b8c\u6210 TCP \u6536\u53d1\uff0c\u518d\u5904\u7406\u6d88\u606f\u8fb9\u754c\u3001\u65ad\u7ebf\u4e0e\u91cd\u8fde - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/119700.html","og_locale":"zh_CN","og_type":"article","og_title":"\u8ba9 Buildroot \u670d\u52a1\u5148\u5b8c\u6210 TCP \u6536\u53d1\uff0c\u518d\u5904\u7406\u6d88\u606f\u8fb9\u754c\u3001\u65ad\u7ebf\u4e0e\u91cd\u8fde - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u8ba9 Buildroot \u670d\u52a1\u5148\u5b8c\u6210 TCP \u6536\u53d1&#xff0c;\u518d\u5904\u7406\u6d88\u606f\u8fb9\u754c\u3001\u65ad\u7ebf\u4e0e\u91cd\u8fde \u4e0a\u4e00\u7bc7\u4e3a debug-demo \u670d\u52a1\u521b\u5efa\u4e86\u4e13\u7528\u8d26\u6237&#xff0c;\u5e76\u5728 QEMU \u4e2d\u9a8c\u8bc1\u4e86\u964d\u6743\u540e\u7684\u670d\u52a1\u4ecd\u80fd\u5199\u65e5\u5fd7\u3001\u540c\u65f6\u65e0\u6cd5\u8bfb\u53d6 root-only \u6d4b\u8bd5\u6587\u4ef6\u3002\u8fd9\u7bc7\u6cbf\u7528\u540c\u4e00\u5957 Ubuntu\u3001Buildroot \u548c QEMU \u73af\u5883&#xff0c;\u8ba9\u8fd9\u4e2a\u524d\u53f0\u670d\u52a1\u518d\u589e\u52a0\u4e00\u9879\u80fd\u529b&#xff1a;\u8fde\u63a5 Ubuntu \u4e3b\u673a\u4e0a\u7684\u6d4b\u8bd5\u670d\u52a1&#xff0c;\u5468\u671f\u6027\u53d1\u9001\u4e00\u884c\u8bf7\u6c42\u5e76\u63a5\u6536\u4e00\u884c\u54cd\u5e94\u3002 \u672c\u6587\u5148\u8ba9\u6700\u5c0f\u6536","og_url":"https:\/\/www.wsisp.com\/helps\/119700.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-10-29T23:40:36+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"23 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/119700.html","url":"https:\/\/www.wsisp.com\/helps\/119700.html","name":"\u8ba9 Buildroot \u670d\u52a1\u5148\u5b8c\u6210 TCP \u6536\u53d1\uff0c\u518d\u5904\u7406\u6d88\u606f\u8fb9\u754c\u3001\u65ad\u7ebf\u4e0e\u91cd\u8fde - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-10-29T23:40:36+00:00","dateModified":"2026-10-29T23:40:36+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/119700.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/119700.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/119700.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u8ba9 Buildroot \u670d\u52a1\u5148\u5b8c\u6210 TCP \u6536\u53d1\uff0c\u518d\u5904\u7406\u6d88\u606f\u8fb9\u754c\u3001\u65ad\u7ebf\u4e0e\u91cd\u8fde"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/119700","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=119700"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/119700\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=119700"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=119700"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=119700"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=119700"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}