{"id":122006,"date":"2026-11-04T05:09:44","date_gmt":"2026-11-03T21:09:44","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/122006.html"},"modified":"2026-11-04T05:09:44","modified_gmt":"2026-11-03T21:09:44","slug":"%e7%ac%ac8%e8%ae%b2%ef%bc%9a%e8%bf%9b%e7%a8%8b%e9%97%b4%e9%80%9a%e4%bf%a1","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/122006.html","title":{"rendered":"\u7b2c8\u8bb2\uff1a\u8fdb\u7a0b\u95f4\u901a\u4fe1"},"content":{"rendered":"<h3>\u76ee\u5f55<\/h3>\n<ul>\n<li>\u672c\u8282\u91cd\u70b9<\/li>\n<li>1. \u8fdb\u7a0b\u95f4\u901a\u4fe1\u4ecb\u7ecd<\/li>\n<li>2. \u7ba1\u9053<\/li>\n<li>3. \u533f\u540d\u7ba1\u9053<\/li>\n<li>4. \u547d\u540d\u7ba1\u9053<\/li>\n<li>5. System V \u5171\u4eab\u5185\u5b58<\/li>\n<li>6. System V \u6d88\u606f\u961f\u5217&#xff08;\u9009\u5b66\u4e86\u89e3\u5373\u53ef&#xff09;<\/li>\n<li>7. System V \u4fe1\u53f7\u91cf&#xff08;\u9009\u5b66\u4e86\u89e3\u5373\u53ef&#xff09;<\/li>\n<li>8. \u5185\u6838\u662f\u5982\u4f55\u7ec4\u7ec7\u7ba1\u7406 IPC \u8d44\u6e90\u7684<\/li>\n<li>\u9644\u5f55<\/li>\n<\/ul>\n<h3>\u672c\u8282\u91cd\u70b9<\/h3>\n<ul>\n<li>\u8fdb\u7a0b\u95f4\u901a\u4fe1\u4ecb\u7ecd<\/li>\n<li>\u638c\u63e1\u533f\u540d\u3001\u547d\u540d\u7ba1\u9053\u539f\u7406\u53ca\u64cd\u4f5c<\/li>\n<li>\u7f16\u5199\u8fdb\u7a0b\u6c60<\/li>\n<li>\u638c\u63e1\u5171\u4eab\u5185\u5b58<\/li>\n<li>\u4e86\u89e3\u6d88\u606f\u961f\u5217<\/li>\n<li>\u4e86\u89e3\u4fe1\u53f7\u91cf<\/li>\n<li>\u7406\u89e3\u5185\u6838\u7ba1\u7406 IPC \u8d44\u6e90\u7684\u65b9\u5f0f&#xff0c;\u4e86\u89e3 C \u5b9e\u73b0\u591a\u6001<\/li>\n<\/ul>\n<h3>1. \u8fdb\u7a0b\u95f4\u901a\u4fe1\u4ecb\u7ecd<\/h3>\n<h4>1-1 \u8fdb\u7a0b\u95f4\u901a\u4fe1\u76ee\u7684<\/h4>\n<ul>\n<li>\u6570\u636e\u4f20\u8f93&#xff1a;\u4e00\u4e2a\u8fdb\u7a0b\u9700\u8981\u5c06\u5b83\u7684\u6570\u636e\u53d1\u9001\u7ed9\u53e6\u4e00\u4e2a\u8fdb\u7a0b\u3002<\/li>\n<li>\u8d44\u6e90\u5171\u4eab&#xff1a;\u591a\u4e2a\u8fdb\u7a0b\u4e4b\u95f4\u5171\u4eab\u540c\u6837\u7684\u8d44\u6e90\u3002<\/li>\n<li>\u901a\u77e5\u4e8b\u4ef6&#xff1a;\u4e00\u4e2a\u8fdb\u7a0b\u9700\u8981\u5411\u53e6\u4e00\u4e2a\u6216\u4e00\u7ec4\u8fdb\u7a0b\u53d1\u9001\u6d88\u606f&#xff0c;\u901a\u77e5\u5b83&#xff08;\u5b83\u4eec&#xff09;\u53d1\u751f\u4e86\u67d0\u79cd\u4e8b\u4ef6&#xff08;\u5982\u8fdb\u7a0b\u7ec8\u6b62\u65f6\u8981\u901a\u77e5\u7236\u8fdb\u7a0b&#xff09;\u3002<\/li>\n<li>\u8fdb\u7a0b\u63a7\u5236&#xff1a;\u6709\u4e9b\u8fdb\u7a0b\u5e0c\u671b\u5b8c\u5168\u63a7\u5236\u53e6\u4e00\u4e2a\u8fdb\u7a0b\u7684\u6267\u884c&#xff08;\u5982 Debug \u8fdb\u7a0b&#xff09;\u3002\u6b64\u65f6\u63a7\u5236\u8fdb\u7a0b\u5e0c\u671b\u80fd\u591f\u62e6\u622a\u53e6\u4e00\u4e2a\u8fdb\u7a0b\u7684\u6240\u6709\u9677\u5165\u548c\u5f02\u5e38&#xff0c;\u5e76\u80fd\u591f\u53ca\u65f6\u77e5\u9053\u5b83\u7684\u72b6\u6001\u6539\u53d8\u3002<\/li>\n<\/ul>\n<h4>1-2 \u8fdb\u7a0b\u95f4\u901a\u4fe1\u53d1\u5c55<\/h4>\n<ul>\n<li>\u7ba1\u9053<\/li>\n<li>System V \u8fdb\u7a0b\u95f4\u901a\u4fe1<\/li>\n<li>POSIX \u8fdb\u7a0b\u95f4\u901a\u4fe1<\/li>\n<\/ul>\n<h4>1-3 \u8fdb\u7a0b\u95f4\u901a\u4fe1\u5206\u7c7b<\/h4>\n<h5>\u7ba1\u9053<\/h5>\n<ul>\n<li>\u533f\u540d\u7ba1\u9053 pipe<\/li>\n<li>\u547d\u540d\u7ba1\u9053<\/li>\n<\/ul>\n<h5>System V IPC<\/h5>\n<ul>\n<li>System V \u6d88\u606f\u961f\u5217<\/li>\n<li>System V \u5171\u4eab\u5185\u5b58<\/li>\n<li>System V \u4fe1\u53f7\u91cf<\/li>\n<\/ul>\n<h5>POSIX IPC<\/h5>\n<ul>\n<li>\u6d88\u606f\u961f\u5217<\/li>\n<li>\u5171\u4eab\u5185\u5b58<\/li>\n<li>\u4fe1\u53f7\u91cf<\/li>\n<li>\u4e92\u65a5\u91cf<\/li>\n<li>\u6761\u4ef6\u53d8\u91cf<\/li>\n<li>\u8bfb\u5199\u9501<\/li>\n<\/ul>\n<h3>2. \u7ba1\u9053<\/h3>\n<h4>\u4ec0\u4e48\u662f\u7ba1\u9053<\/h4>\n<ul>\n<li>\u7ba1\u9053\u662f Unix \u4e2d\u6700\u53e4\u8001\u7684\u8fdb\u7a0b\u95f4\u901a\u4fe1\u7684\u5f62\u5f0f\u3002<\/li>\n<li>\u6211\u4eec\u628a\u4ece\u4e00\u4e2a\u8fdb\u7a0b\u8fde\u63a5\u5230\u53e6\u4e00\u4e2a\u8fdb\u7a0b\u7684\u4e00\u4e2a\u6570\u636e\u6d41\u79f0\u4e3a\u4e00\u4e2a\u201c\u7ba1\u9053\u201d\u3002<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210932-6aea4d8cccece.png\" alt=\"image.png\" \/><\/p>\n<h3>3. \u533f\u540d\u7ba1\u9053<\/h3>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">pipe<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<ul>\n<li>\u529f\u80fd&#xff1a;\u521b\u5efa\u4e00\u4e2a\u65e0\u540d\u7ba1\u9053\u3002<\/li>\n<li>\u53c2\u6570&#xff1a;fd \u662f\u6587\u4ef6\u63cf\u8ff0\u7b26\u6570\u7ec4&#xff0c;\u5176\u4e2d fd[0] \u8868\u793a\u8bfb\u7aef&#xff0c;fd[1] \u8868\u793a\u5199\u7aef\u3002<\/li>\n<li>\u8fd4\u56de\u503c&#xff1a;\u6210\u529f\u8fd4\u56de 0&#xff1b;\u5931\u8d25\u8fd4\u56de -1&#xff0c;\u5e76\u8bbe\u7f6e errno\u3002<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210933-6aea4d8d3a5c6.png\" alt=\"image.png\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210933-6aea4d8d726c5.png\" alt=\"image.png\" \/><\/p>\n<h4>3-1 \u5b9e\u4f8b\u4ee3\u7801<\/h4>\n<p>\u4f8b\u5b50&#xff1a;\u4ece\u952e\u76d8\u8bfb\u53d6\u6570\u636e&#xff0c;\u5199\u5165\u7ba1\u9053&#xff0c;\u8bfb\u53d6\u7ba1\u9053&#xff0c;\u5199\u5230\u5c4f\u5e55\u3002<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdlib.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> fds<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> buf<span class=\"token punctuation\">[<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> len<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">pipe<\/span><span class=\"token punctuation\">(<\/span>fds<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;make pipe&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ read from stdin<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">fgets<\/span><span class=\"token punctuation\">(<\/span>buf<span class=\"token punctuation\">,<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token constant\">stdin<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        len <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">strlen<\/span><span class=\"token punctuation\">(<\/span>buf<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ write into pipe<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">write<\/span><span class=\"token punctuation\">(<\/span>fds<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> buf<span class=\"token punctuation\">,<\/span> len<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> len<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;write to pipe&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span>buf<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>buf<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ read from pipe<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>len <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">read<\/span><span class=\"token punctuation\">(<\/span>fds<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> buf<span class=\"token punctuation\">,<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;read from pipe&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ write to stdout<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">write<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> buf<span class=\"token punctuation\">,<\/span> len<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> len<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;write to stdout&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>3-2 \u7528 fork \u6765\u5171\u4eab\u7ba1\u9053\u539f\u7406<\/h4>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210933-6aea4d8dafea6.png\" alt=\"image.png\" \/><\/p>\n<h4>3-3 \u7ad9\u5728\u6587\u4ef6\u63cf\u8ff0\u7b26\u89d2\u5ea6\u2014\u2014\u6df1\u5ea6\u7406\u89e3\u7ba1\u9053<\/h4>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210934-6aea4d8e04701.png\" alt=\"image.png\" \/><\/p>\n<h4>3-4 \u7ad9\u5728\u5185\u6838\u89d2\u5ea6\u2014\u2014\u7ba1\u9053\u672c\u8d28<\/h4>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210934-6aea4d8ea8d31.png\" alt=\"image.png\" \/><\/p>\n<ul>\n<li>\u6240\u4ee5&#xff0c;\u770b\u5f85\u7ba1\u9053&#xff0c;\u5c31\u5982\u540c\u770b\u5f85\u6587\u4ef6\u4e00\u6837&#xff01;\u7ba1\u9053\u7684\u4f7f\u7528\u548c\u6587\u4ef6\u4e00\u81f4&#xff0c;\u8fce\u5408\u4e86\u201cLinux \u4e00\u5207\u7686\u6587\u4ef6\u601d\u60f3\u201d\u3002<\/li>\n<\/ul>\n<h4>3-5 \u7ba1\u9053\u6837\u4f8b<\/h4>\n<h5>3-5-1 \u6d4b\u8bd5\u7ba1\u9053\u8bfb\u5199<\/h5>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdlib.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;errno.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">ERR_EXIT<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>m<span class=\"token punctuation\">)<\/span> <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n<span class=\"token expression\"><span class=\"token keyword\">do<\/span> <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n<span class=\"token expression\"><span class=\"token punctuation\">{<\/span> <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span>m<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>EXIT_FAILURE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n<span class=\"token expression\"><span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> argc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>argv<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> pipefd<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">pipe<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token function\">ERR_EXIT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;pipe error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token class-name\">pid_t<\/span> pid<span class=\"token punctuation\">;<\/span><br \/>\n    pid <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">fork<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pid <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token function\">ERR_EXIT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;fork error&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pid <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">write<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;hello&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>EXIT_SUCCESS<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> buf<span class=\"token punctuation\">[<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">read<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> buf<span class=\"token punctuation\">,<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;buf&#061;%s\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> buf<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h5>3-5-2 \u521b\u5efa\u8fdb\u7a0b\u6c60\u5904\u7406\u4efb\u52a1<\/h5>\n<h6>Channel.hpp<\/h6>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\">__CHANNEL_HPP__<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">__CHANNEL_HPP__<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5148\u63cf\u8ff0<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Channel<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">Channel<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> wfd<span class=\"token punctuation\">,<\/span> pid_t who<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">:<\/span> <span class=\"token function\">_wfd<\/span><span class=\"token punctuation\">(<\/span>wfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">_who<\/span><span class=\"token punctuation\">(<\/span>who<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ Channel-3-1234<\/span><br \/>\n        _name <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;Channel-&#034;<\/span> <span class=\"token operator\">&#043;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_string<\/span><span class=\"token punctuation\">(<\/span>wfd<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;-&#034;<\/span> <span class=\"token operator\">&#043;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">to_string<\/span><span class=\"token punctuation\">(<\/span>who<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    std<span class=\"token double-colon punctuation\">::<\/span>string <span class=\"token function\">Name<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> _name<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">Send<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> cmd<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">write<\/span><span class=\"token punctuation\">(<\/span>_wfd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>cmd<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>cmd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">Close<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>_wfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    pid_t <span class=\"token function\">Id<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> _who<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">int<\/span> <span class=\"token function\">wFd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> _wfd<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token operator\">~<\/span><span class=\"token function\">Channel<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> _wfd<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>string _name<span class=\"token punctuation\">;<\/span><br \/>\n    pid_t _who<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<h6>ProcessPool.hpp<\/h6>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\">__PROCESS_POOL_HPP__<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">__PROCESS_POOL_HPP__<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;vector&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;cstdlib&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/wait.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;functional&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;Task.hpp&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;Channel.hpp&#034;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ typedef std::function&lt;void()&gt; work_t;<\/span><br \/>\n<span class=\"token keyword\">using<\/span> work_t <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>function<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">enum<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    OK <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    UsageError<span class=\"token punctuation\">,<\/span><br \/>\n    PipeError<span class=\"token punctuation\">,<\/span><br \/>\n    ForkError<br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">ProcessPool<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">ProcessPool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> n<span class=\"token punctuation\">,<\/span> work_t w<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token operator\">:<\/span> <span class=\"token function\">processnum<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">work<\/span><span class=\"token punctuation\">(<\/span>w<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ channels&#xff1a;\u8f93\u51fa\u578b\u53c2\u6570<\/span><br \/>\n    <span class=\"token comment\">\/\/ work_t work&#xff1a;\u56de\u8c03<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> <span class=\"token function\">InitProcessPool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ 2. \u521b\u5efa\u6307\u5b9a\u4e2a\u6570\u4e2a\u8fdb\u7a0b<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> processnum<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ 1. \u5148\u6709\u7ba1\u9053<\/span><br \/>\n            <span class=\"token keyword\">int<\/span> pipefd<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">pipe<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> PipeError<span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ 2. \u521b\u5efa\u8fdb\u7a0b<\/span><br \/>\n            pid_t id <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">fork<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>id <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> ForkError<span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ 3. \u5efa\u7acb\u901a\u4fe1\u4fe1\u9053<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>id <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u5173\u95ed\u5386\u53f2 wfd<\/span><br \/>\n                std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token function\">getpid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;, child close history fd: &#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span> <span class=\"token operator\">&amp;<\/span>c <span class=\"token operator\">:<\/span> channels<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> c<span class=\"token punctuation\">.<\/span><span class=\"token function\">wFd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; &#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    c<span class=\"token punctuation\">.<\/span><span class=\"token function\">Close<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; over&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>                <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ read<\/span><br \/>\n                <span class=\"token comment\">\/\/ child<\/span><br \/>\n                std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;debug: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> pipefd<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token function\">dup2<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><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><br \/>\n                <span class=\"token function\">work<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ \u7236\u8fdb\u7a0b\u6267\u884c<\/span><br \/>\n            <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ write<\/span><br \/>\n            channels<span class=\"token punctuation\">.<\/span><span class=\"token function\">emplace_back<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ Channel ch(pipefd[1], id);<\/span><br \/>\n            <span class=\"token comment\">\/\/ channels.push_back(ch);<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> OK<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">DispatchTask<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> who <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 2. \u6d3e\u53d1\u4efb\u52a1<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> num <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">20<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span>num<span class=\"token operator\">&#8212;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ a. \u9009\u62e9\u4e00\u4e2a\u4efb\u52a1&#xff0c;\u6574\u6570<\/span><br \/>\n            <span class=\"token keyword\">int<\/span> task <span class=\"token operator\">&#061;<\/span> tm<span class=\"token punctuation\">.<\/span><span class=\"token function\">SelectTask<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ b. \u9009\u62e9\u4e00\u4e2a\u5b50\u8fdb\u7a0b channel<\/span><br \/>\n            Channel <span class=\"token operator\">&amp;<\/span>curr <span class=\"token operator\">&#061;<\/span> channels<span class=\"token punctuation\">[<\/span>who<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            who <span class=\"token operator\">%&#061;<\/span> channels<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;######################&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;send &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> task <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; to &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> curr<span class=\"token punctuation\">.<\/span><span class=\"token function\">Name<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                      <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;, \u4efb\u52a1\u8fd8\u5269: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> num <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;######################&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ c. \u6d3e\u53d1\u4efb\u52a1<\/span><br \/>\n            curr<span class=\"token punctuation\">.<\/span><span class=\"token function\">Send<\/span><span class=\"token punctuation\">(<\/span>task<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token function\">sleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">CleanProcessPool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ version 3<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span> <span class=\"token operator\">&amp;<\/span>c <span class=\"token operator\">:<\/span> channels<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            c<span class=\"token punctuation\">.<\/span><span class=\"token function\">Close<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            pid_t rid <span class=\"token operator\">&#061;<\/span> <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">waitpid<\/span><span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">.<\/span><span class=\"token function\">Id<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rid <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;child &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> rid <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; wait &#8230; success&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ version 2<\/span><br \/>\n        <span class=\"token comment\">\/\/ for (auto &amp;c : channels)<\/span><br \/>\n        <span class=\"token comment\">\/\/ for (int i &#061; channels.size() &#8211; 1; i &gt;&#061; 0; i&#8211;)<\/span><br \/>\n        <span class=\"token comment\">\/\/ {<\/span><br \/>\n        <span class=\"token comment\">\/\/     channels[i].Close();<\/span><br \/>\n        <span class=\"token comment\">\/\/     pid_t rid &#061; ::waitpid(channels[i].Id(), nullptr, 0); \/\/ \u963b\u585e\u4e86&#xff01;<\/span><br \/>\n        <span class=\"token comment\">\/\/     if (rid &gt; 0)<\/span><br \/>\n        <span class=\"token comment\">\/\/     {<\/span><br \/>\n        <span class=\"token comment\">\/\/         std::cout &lt;&lt; &#034;child &#034; &lt;&lt; rid &lt;&lt; &#034; wait &#8230; success&#034; &lt;&lt; std::endl;<\/span><br \/>\n        <span class=\"token comment\">\/\/     }<\/span><br \/>\n        <span class=\"token comment\">\/\/ }<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ version 1<\/span><br \/>\n        <span class=\"token comment\">\/\/ for (auto &amp;c : channels)<\/span><br \/>\n        <span class=\"token comment\">\/\/ {<\/span><br \/>\n        <span class=\"token comment\">\/\/     c.Close();<\/span><br \/>\n        <span class=\"token comment\">\/\/ }<\/span><br \/>\n        <span class=\"token comment\">\/\/?<\/span><br \/>\n        <span class=\"token comment\">\/\/ for (auto &amp;c : channels)<\/span><br \/>\n        <span class=\"token comment\">\/\/ {<\/span><br \/>\n        <span class=\"token comment\">\/\/     pid_t rid &#061; ::waitpid(c.Id(), nullptr, 0);<\/span><br \/>\n        <span class=\"token comment\">\/\/     if (rid &gt; 0)<\/span><br \/>\n        <span class=\"token comment\">\/\/     {<\/span><br \/>\n        <span class=\"token comment\">\/\/         std::cout &lt;&lt; &#034;child &#034; &lt;&lt; rid &lt;&lt; &#034; wait &#8230; success&#034; &lt;&lt; std::endl;<\/span><br \/>\n        <span class=\"token comment\">\/\/     }<\/span><br \/>\n        <span class=\"token comment\">\/\/ }<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">DebugPrint<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">auto<\/span> <span class=\"token operator\">&amp;<\/span>c <span class=\"token operator\">:<\/span> channels<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> c<span class=\"token punctuation\">.<\/span><span class=\"token function\">Name<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>Channel<span class=\"token operator\">&gt;<\/span> channels<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> processnum<span class=\"token punctuation\">;<\/span><br \/>\n    work_t work<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<h6>Task.hpp<\/h6>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\">once<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unordered_map&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;functional&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;ctime&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">using<\/span> task_t <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>function<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">TaskManger<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">TaskManger<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">srand<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">time<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        tasks<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span> std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;sub process[&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token function\">getpid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; ] \u6267\u884c\u8bbf\u95ee\u6570\u636e\u5e93\u7684\u4efb\u52a1\\\\n&#034;<\/span><br \/>\n                        <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        tasks<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span> std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;sub process[&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token function\">getpid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; ] \u6267\u884curl\u89e3\u6790\\\\n&#034;<\/span><br \/>\n                        <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        tasks<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span> std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;sub process[&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token function\">getpid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; ] \u6267\u884c\u52a0\u5bc6\u4efb\u52a1\\\\n&#034;<\/span><br \/>\n                        <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        tasks<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span> std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;sub process[&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token function\">getpid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; ] \u6267\u884c\u6570\u636e\u6301\u4e45\u5316\u4efb\u52a1\\\\n&#034;<\/span><br \/>\n                        <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">int<\/span> <span class=\"token function\">SelectTask<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token function\">rand<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">%<\/span> tasks<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">void<\/span> <span class=\"token function\">Excute<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">long<\/span> number<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>number <span class=\"token operator\">&gt;&#061;<\/span> tasks<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        tasks<span class=\"token punctuation\">[<\/span>number<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token operator\">~<\/span><span class=\"token function\">TaskManger<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">private<\/span><span class=\"token operator\">:<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>task_t<span class=\"token operator\">&gt;<\/span> tasks<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>TaskManger tm<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">Worker<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> cmd <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">read<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>cmd<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>cmd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>cmd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            tm<span class=\"token punctuation\">.<\/span><span class=\"token function\">Excute<\/span><span class=\"token punctuation\">(<\/span>cmd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;pid: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token function\">getpid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; quit&#8230;&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h6>Main.cc<\/h6>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;ProcessPool.hpp&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;Task.hpp&#034;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">Usage<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string proc<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;Usage: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> proc <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; process-num&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>endl<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6211\u4eec\u81ea\u5df1\u5c31\u662f master<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> argc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>argv<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>argc <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">Usage<\/span><span class=\"token punctuation\">(<\/span>argv<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> UsageError<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> num <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stoi<\/span><span class=\"token punctuation\">(<\/span>argv<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    ProcessPool <span class=\"token operator\">*<\/span>pp <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token function\">ProcessPool<\/span><span class=\"token punctuation\">(<\/span>num<span class=\"token punctuation\">,<\/span> Worker<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 1. \u521d\u59cb\u5316\u8fdb\u7a0b\u6c60<\/span><br \/>\n    pp<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">InitProcessPool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ 2. \u6d3e\u53d1\u4efb\u52a1<\/span><br \/>\n    pp<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">DispatchTask<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ 3. \u9000\u51fa\u8fdb\u7a0b\u6c60<\/span><br \/>\n    pp<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">CleanProcessPool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ std::vector&lt;Channel&gt; channels;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \/\/ 1. \u521d\u59cb\u5316\u8fdb\u7a0b\u6c60<\/span><br \/>\n    <span class=\"token comment\">\/\/ InitProcessPool(num, channels, Worker);<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \/\/ 2. \u6d3e\u53d1\u4efb\u52a1<\/span><br \/>\n    <span class=\"token comment\">\/\/ DispatchTask(channels);<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \/\/ 3. \u9000\u51fa\u8fdb\u7a0b\u6c60<\/span><br \/>\n    <span class=\"token comment\">\/\/ CleanProcessPool(channels);<\/span><\/p>\n<p>    <span class=\"token keyword\">delete<\/span> pp<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h6>Makefile<\/h6>\n<p>BIN&#061;processpool<br \/>\nCC&#061;g&#043;&#043;<br \/>\nFLAGS&#061;-c -Wall -std&#061;c&#043;&#043;11<br \/>\nLDFLAGS&#061;-o<br \/>\n# SRC&#061;$(shell ls *.cc)<br \/>\nSRC&#061;$(wildcard *.cc)<br \/>\nOBJ&#061;$(SRC:.cc&#061;.o)<\/p>\n<p>$(BIN):$(OBJ)<br \/>\n$(CC) $(LDFLAGS) $&#064; $^<\/p>\n<p>%.o:%.cc<br \/>\n$(CC) $(FLAGS) $&lt;<\/p>\n<p>.PHONY:clean<br \/>\nclean:<br \/>\nrm -f $(BIN) $(OBJ)<\/p>\n<p>.PHONY: test<br \/>\ntest:<br \/>\n&#064;echo $(SRC)<br \/>\n&#064;echo $(OBJ)<\/p>\n<h4>3-6 \u7ba1\u9053\u8bfb\u5199\u89c4\u5219<\/h4>\n<ul>\n<li>\u5f53\u6ca1\u6709\u6570\u636e\u53ef\u8bfb\u65f6&#xff1a;\n<ul>\n<li>O_NONBLOCK disable&#xff1a;read \u8c03\u7528\u963b\u585e&#xff0c;\u5373\u8fdb\u7a0b\u6682\u505c\u6267\u884c&#xff0c;\u4e00\u76f4\u7b49\u5230\u6709\u6570\u636e\u6765\u5230\u4e3a\u6b62\u3002<\/li>\n<li>O_NONBLOCK enable&#xff1a;read \u8c03\u7528\u8fd4\u56de -1&#xff0c;errno \u503c\u4e3a EAGAIN\u3002<\/li>\n<\/ul>\n<\/li>\n<li>\u5f53\u7ba1\u9053\u6ee1\u7684\u65f6\u5019&#xff1a;\n<ul>\n<li>O_NONBLOCK disable&#xff1a;write \u8c03\u7528\u963b\u585e&#xff0c;\u76f4\u5230\u6709\u8fdb\u7a0b\u8bfb\u8d70\u6570\u636e\u3002<\/li>\n<li>O_NONBLOCK enable&#xff1a;\u8c03\u7528\u8fd4\u56de -1&#xff0c;errno \u503c\u4e3a EAGAIN\u3002<\/li>\n<\/ul>\n<\/li>\n<li>\u5982\u679c\u6240\u6709\u7ba1\u9053\u5199\u7aef\u5bf9\u5e94\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u88ab\u5173\u95ed&#xff0c;\u5219 read \u8fd4\u56de 0\u3002<\/li>\n<li>\u5982\u679c\u6240\u6709\u7ba1\u9053\u8bfb\u7aef\u5bf9\u5e94\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u88ab\u5173\u95ed&#xff0c;\u5219 write \u64cd\u4f5c\u4f1a\u4ea7\u751f\u4fe1\u53f7 SIGPIPE&#xff0c;\u8fdb\u800c\u53ef\u80fd\u5bfc\u81f4\u5199\u8fdb\u7a0b\u9000\u51fa\u3002<\/li>\n<li>\u5f53\u8981\u5199\u5165\u7684\u6570\u636e\u91cf\u4e0d\u5927\u4e8e PIPE_BUF \u65f6&#xff0c;Linux \u5c06\u4fdd\u8bc1\u5199\u5165\u7684\u539f\u5b50\u6027\u3002<\/li>\n<li>\u5f53\u8981\u5199\u5165\u7684\u6570\u636e\u91cf\u5927\u4e8e PIPE_BUF \u65f6&#xff0c;Linux \u5c06\u4e0d\u518d\u4fdd\u8bc1\u5199\u5165\u7684\u539f\u5b50\u6027\u3002<\/li>\n<\/ul>\n<h4>3-7 \u7ba1\u9053\u7279\u70b9<\/h4>\n<ul>\n<li>\u53ea\u80fd\u7528\u4e8e\u5177\u6709\u5171\u540c\u7956\u5148\u7684\u8fdb\u7a0b&#xff08;\u5177\u6709\u4eb2\u7f18\u5173\u7cfb\u7684\u8fdb\u7a0b&#xff09;\u4e4b\u95f4\u8fdb\u884c\u901a\u4fe1&#xff1b;\u901a\u5e38&#xff0c;\u4e00\u4e2a\u7ba1\u9053\u7531\u4e00\u4e2a\u8fdb\u7a0b\u521b\u5efa&#xff0c;\u7136\u540e\u8be5\u8fdb\u7a0b\u8c03\u7528 fork&#xff0c;\u6b64\u540e\u7236\u3001\u5b50\u8fdb\u7a0b\u4e4b\u95f4\u5c31\u53ef\u5e94\u7528\u8be5\u7ba1\u9053\u3002<\/li>\n<li>\u7ba1\u9053\u63d0\u4f9b\u6d41\u5f0f\u670d\u52a1\u3002<\/li>\n<li>\u4e00\u822c\u800c\u8a00&#xff0c;\u8fdb\u7a0b\u9000\u51fa&#xff0c;\u7ba1\u9053\u91ca\u653e&#xff0c;\u6240\u4ee5\u7ba1\u9053\u7684\u751f\u547d\u5468\u671f\u968f\u8fdb\u7a0b\u3002<\/li>\n<li>\u4e00\u822c\u800c\u8a00&#xff0c;\u5185\u6838\u4f1a\u5bf9\u7ba1\u9053\u64cd\u4f5c\u8fdb\u884c\u540c\u6b65\u4e0e\u4e92\u65a5\u3002<\/li>\n<li>\u7ba1\u9053\u662f\u534a\u53cc\u5de5\u7684&#xff0c;\u6570\u636e\u53ea\u80fd\u5411\u4e00\u4e2a\u65b9\u5411\u6d41\u52a8&#xff1b;\u9700\u8981\u53cc\u65b9\u901a\u4fe1\u65f6&#xff0c;\u9700\u8981\u5efa\u7acb\u4e24\u4e2a\u7ba1\u9053\u3002<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210935-6aea4d8f55419.png\" alt=\"image.png\" \/><\/p>\n<h4>3-8 \u9a8c\u8bc1\u7ba1\u9053\u901a\u4fe1\u7684 4 \u79cd\u60c5\u51b5<\/h4>\n<ul>\n<li>\u8bfb\u6b63\u5e38 &amp;&amp; \u5199\u6ee1<\/li>\n<li>\u5199\u6b63\u5e38 &amp;&amp; \u8bfb\u7a7a<\/li>\n<li>\u5199\u5173\u95ed &amp;&amp; \u8bfb\u6b63\u5e38<\/li>\n<li>\u8bfb\u5173\u95ed &amp;&amp; \u5199\u6b63\u5e38<\/li>\n<\/ul>\n<h3>4. \u547d\u540d\u7ba1\u9053<\/h3>\n<ul>\n<li>\u7ba1\u9053\u5e94\u7528\u7684\u4e00\u4e2a\u9650\u5236\u5c31\u662f\u53ea\u80fd\u5728\u5177\u6709\u5171\u540c\u7956\u5148&#xff08;\u5177\u6709\u4eb2\u7f18\u5173\u7cfb&#xff09;\u7684\u8fdb\u7a0b\u95f4\u901a\u4fe1\u3002<\/li>\n<li>\u5982\u679c\u6211\u4eec\u60f3\u5728\u4e0d\u76f8\u5173\u7684\u8fdb\u7a0b\u4e4b\u95f4\u4ea4\u6362\u6570\u636e&#xff0c;\u53ef\u4ee5\u4f7f\u7528 FIFO \u6587\u4ef6\u6765\u505a\u8fd9\u9879\u5de5\u4f5c&#xff0c;\u5b83\u7ecf\u5e38\u88ab\u79f0\u4e3a\u547d\u540d\u7ba1\u9053\u3002<\/li>\n<li>\u547d\u540d\u7ba1\u9053\u662f\u4e00\u79cd\u7279\u6b8a\u7c7b\u578b\u7684\u6587\u4ef6\u3002<\/li>\n<\/ul>\n<h4>4-1 \u521b\u5efa\u4e00\u4e2a\u547d\u540d\u7ba1\u9053<\/h4>\n<p>\u547d\u540d\u7ba1\u9053\u53ef\u4ee5\u4ece\u547d\u4ee4\u884c\u4e0a\u521b\u5efa&#xff0c;\u547d\u4ee4\u884c\u65b9\u6cd5\u662f\u4f7f\u7528\u4e0b\u9762\u8fd9\u4e2a\u547d\u4ee4&#xff1a;<\/p>\n<p><span class=\"token function\">mkfifo<\/span> filename<\/p>\n<p>\u547d\u540d\u7ba1\u9053\u4e5f\u53ef\u4ee5\u4ece\u7a0b\u5e8f\u91cc\u521b\u5efa&#xff0c;\u76f8\u5173\u51fd\u6570\u6709&#xff1a;<\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">mkfifo<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>filename<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">mode_t<\/span> mode<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u521b\u5efa\u547d\u540d\u7ba1\u9053&#xff1a;<\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> argc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>argv<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">mkfifo<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;p2&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0644<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>4-2 \u533f\u540d\u7ba1\u9053\u4e0e\u547d\u540d\u7ba1\u9053\u7684\u533a\u522b<\/h4>\n<ul>\n<li>\u533f\u540d\u7ba1\u9053\u7531 pipe \u51fd\u6570\u521b\u5efa\u5e76\u6253\u5f00\u3002<\/li>\n<li>\u547d\u540d\u7ba1\u9053\u7531 mkfifo \u51fd\u6570\u521b\u5efa&#xff0c;\u4f7f\u7528 open \u6253\u5f00\u3002<\/li>\n<li>FIFO&#xff08;\u547d\u540d\u7ba1\u9053&#xff09;\u4e0e pipe&#xff08;\u533f\u540d\u7ba1\u9053&#xff09;\u4e4b\u95f4\u552f\u4e00\u7684\u533a\u522b\u5728\u4e8e\u5b83\u4eec\u521b\u5efa\u4e0e\u6253\u5f00\u7684\u65b9\u5f0f\u4e0d\u540c&#xff0c;\u4e00\u65e6\u8fd9\u4e9b\u5de5\u4f5c\u5b8c\u6210\u4e4b\u540e&#xff0c;\u5b83\u4eec\u5177\u6709\u76f8\u540c\u7684\u8bed\u4e49\u3002<\/li>\n<\/ul>\n<h4>4-3 \u547d\u540d\u7ba1\u9053\u7684\u6253\u5f00\u89c4\u5219<\/h4>\n<ul>\n<li>\u5982\u679c\u5f53\u524d\u6253\u5f00\u64cd\u4f5c\u662f\u4e3a\u8bfb\u800c\u6253\u5f00 FIFO&#xff1a;\n<ul>\n<li>O_NONBLOCK disable&#xff1a;\u963b\u585e\u76f4\u5230\u6709\u76f8\u5e94\u8fdb\u7a0b\u4e3a\u5199\u800c\u6253\u5f00\u8be5 FIFO\u3002<\/li>\n<li>O_NONBLOCK enable&#xff1a;\u7acb\u523b\u8fd4\u56de\u6210\u529f\u3002<\/li>\n<\/ul>\n<\/li>\n<li>\u5982\u679c\u5f53\u524d\u6253\u5f00\u64cd\u4f5c\u662f\u4e3a\u5199\u800c\u6253\u5f00 FIFO&#xff1a;\n<ul>\n<li>O_NONBLOCK disable&#xff1a;\u963b\u585e\u76f4\u5230\u6709\u76f8\u5e94\u8fdb\u7a0b\u4e3a\u8bfb\u800c\u6253\u5f00\u8be5 FIFO\u3002<\/li>\n<li>O_NONBLOCK enable&#xff1a;\u7acb\u523b\u8fd4\u56de\u5931\u8d25&#xff0c;\u9519\u8bef\u7801\u4e3a ENXIO\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h5>\u5b9e\u4f8b 1&#xff1a;\u7528\u547d\u540d\u7ba1\u9053\u5b9e\u73b0\u6587\u4ef6\u62f7\u8d1d<\/h5>\n<p>\u8bfb\u53d6\u6587\u4ef6&#xff0c;\u5199\u5165\u547d\u540d\u7ba1\u9053&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdlib.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;errno.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">ERR_EXIT<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>m<span class=\"token punctuation\">)<\/span>       <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token keyword\">do<\/span> <span class=\"token punctuation\">{<\/span>                  <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token expression\"><span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span>m<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>        <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token expression\"><span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>EXIT_FAILURE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> argc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>argv<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">mkfifo<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;tp&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0644<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">int<\/span> infd<span class=\"token punctuation\">;<\/span><br \/>\n    infd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;abc&#034;<\/span><span class=\"token punctuation\">,<\/span> O_RDONLY<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>infd <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token function\">ERR_EXIT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;open&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">int<\/span> outfd<span class=\"token punctuation\">;<\/span><br \/>\n    outfd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;tp&#034;<\/span><span class=\"token punctuation\">,<\/span> O_WRONLY<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>outfd <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token function\">ERR_EXIT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;open&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">char<\/span> buf<span class=\"token punctuation\">[<\/span><span class=\"token number\">1024<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> n<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">read<\/span><span class=\"token punctuation\">(<\/span>infd<span class=\"token punctuation\">,<\/span> buf<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1024<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">write<\/span><span class=\"token punctuation\">(<\/span>outfd<span class=\"token punctuation\">,<\/span> buf<span class=\"token punctuation\">,<\/span> n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>infd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>outfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u8bfb\u53d6\u7ba1\u9053&#xff0c;\u5199\u5165\u76ee\u6807\u6587\u4ef6&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdlib.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;errno.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">ERR_EXIT<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>m<span class=\"token punctuation\">)<\/span>       <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token keyword\">do<\/span> <span class=\"token punctuation\">{<\/span>                  <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token expression\"><span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span>m<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>        <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token expression\"><span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>EXIT_FAILURE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> argc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>argv<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> outfd<span class=\"token punctuation\">;<\/span><br \/>\n    outfd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;abc.bak&#034;<\/span><span class=\"token punctuation\">,<\/span> O_WRONLY <span class=\"token operator\">|<\/span> O_CREAT <span class=\"token operator\">|<\/span> O_TRUNC<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0644<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>outfd <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token function\">ERR_EXIT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;open&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">int<\/span> infd<span class=\"token punctuation\">;<\/span><br \/>\n    infd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;tp&#034;<\/span><span class=\"token punctuation\">,<\/span> O_RDONLY<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>infd <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token function\">ERR_EXIT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;open&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">char<\/span> buf<span class=\"token punctuation\">[<\/span><span class=\"token number\">1024<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> n<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">read<\/span><span class=\"token punctuation\">(<\/span>infd<span class=\"token punctuation\">,<\/span> buf<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1024<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">write<\/span><span class=\"token punctuation\">(<\/span>outfd<span class=\"token punctuation\">,<\/span> buf<span class=\"token punctuation\">,<\/span> n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>infd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>outfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">unlink<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;tp&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h5>\u5b9e\u4f8b 2&#xff1a;\u7528\u547d\u540d\u7ba1\u9053\u5b9e\u73b0 server &amp; client \u901a\u4fe1<\/h5>\n<p>\u6d4b\u8bd5\u4ee3\u7801\u7ed3\u6784&#xff1a;<\/p>\n<p># ll<br \/>\ntotal 12<br \/>\n-rw-r&#8211;r&#8211;. 1 root root  46 Sep 18 22:37 clientPipe.c<br \/>\n-rw-r&#8211;r&#8211;. 1 root root 164 Sep 18 22:37 Makefile<br \/>\n-rw-r&#8211;r&#8211;. 1 root root  46 Sep 18 22:38 serverPipe.c<\/p>\n<p>Makefile&#xff1a;<\/p>\n<p>.PHONY: all<br \/>\nall: clientPipe serverPipe<\/p>\n<p>clientPipe: clientPipe.c<br \/>\ngcc -o $&#064; $^<\/p>\n<p>serverPipe: serverPipe.c<br \/>\ngcc -o $&#064; $^<\/p>\n<p>.PHONY: clean<br \/>\nclean:<br \/>\nrm -f clientPipe serverPipe<\/p>\n<p>serverPipe.c&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/stat.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;fcntl.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdlib.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">ERR_EXIT<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>m<span class=\"token punctuation\">)<\/span>       <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token keyword\">do<\/span> <span class=\"token punctuation\">{<\/span>                  <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token expression\"><span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span>m<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>        <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token expression\"><span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>EXIT_FAILURE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">umask<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">mkfifo<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;mypipe&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0644<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">ERR_EXIT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;mkfifo&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">int<\/span> rfd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;mypipe&#034;<\/span><span class=\"token punctuation\">,<\/span> O_RDONLY<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>rfd <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">ERR_EXIT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;open&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">char<\/span> buf<span class=\"token punctuation\">[<\/span><span class=\"token number\">1024<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        buf<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Please wait&#8230;\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token class-name\">ssize_t<\/span> s <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">read<\/span><span class=\"token punctuation\">(<\/span>rfd<span class=\"token punctuation\">,<\/span> buf<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>buf<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            buf<span class=\"token punctuation\">[<\/span>s <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;client say# %s\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> buf<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;client quit, exit now!\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>EXIT_SUCCESS<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">ERR_EXIT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;read&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>rfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>clientPipe.c&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/stat.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;fcntl.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdlib.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">ERR_EXIT<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>m<span class=\"token punctuation\">)<\/span>       <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token keyword\">do<\/span> <span class=\"token punctuation\">{<\/span>                  <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token expression\"><span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span>m<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>        <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n        <span class=\"token expression\"><span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span>EXIT_FAILURE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> wfd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;mypipe&#034;<\/span><span class=\"token punctuation\">,<\/span> O_WRONLY<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>wfd <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">ERR_EXIT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;open&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">char<\/span> buf<span class=\"token punctuation\">[<\/span><span class=\"token number\">1024<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        buf<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Please Enter# &#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">fflush<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">stdout<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token class-name\">ssize_t<\/span> s <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">read<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> buf<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>buf<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            buf<span class=\"token punctuation\">[<\/span>s<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">write<\/span><span class=\"token punctuation\">(<\/span>wfd<span class=\"token punctuation\">,<\/span> buf<span class=\"token punctuation\">,<\/span> <span class=\"token function\">strlen<\/span><span class=\"token punctuation\">(<\/span>buf<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">ERR_EXIT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;read&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>wfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u7ed3\u679c&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210935-6aea4d8fb7e49.png\" alt=\"image.png\" \/><\/p>\n<h3>5. System V \u5171\u4eab\u5185\u5b58<\/h3>\n<p>\u5171\u4eab\u5185\u5b58\u533a\u662f\u6700\u5feb\u7684 IPC \u5f62\u5f0f\u3002\u4e00\u65e6\u8fd9\u6837\u7684\u5185\u5b58\u6620\u5c04\u5230\u5171\u4eab\u5b83\u7684\u8fdb\u7a0b\u7684\u5730\u5740\u7a7a\u95f4&#xff0c;\u8fd9\u4e9b\u8fdb\u7a0b\u95f4\u7684\u6570\u636e\u4f20\u9012\u4e0d\u518d\u6d89\u53ca\u5185\u6838\u3002\u6362\u53e5\u8bdd\u8bf4&#xff0c;\u8fdb\u7a0b\u4e0d\u518d\u901a\u8fc7\u6267\u884c\u8fdb\u5165\u5185\u6838\u7684\u7cfb\u7edf\u8c03\u7528\u6765\u4f20\u9012\u5f7c\u6b64\u7684\u6570\u636e\u3002<\/p>\n<h4>5-1 \u5171\u4eab\u5185\u5b58\u793a\u610f\u56fe<\/h4>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210935-6aea4d8fdedef.png\" alt=\"image.png\" \/><\/p>\n<h4>5-2 \u5171\u4eab\u5185\u5b58\u6570\u636e\u7ed3\u6784<\/h4>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">shmid_ds<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">ipc_perm<\/span> shm_perm<span class=\"token punctuation\">;<\/span>          <span class=\"token comment\">\/* operation perms *\/<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> shm_segsz<span class=\"token punctuation\">;<\/span>                     <span class=\"token comment\">\/* size of segment (bytes) *\/<\/span><br \/>\n    __kernel_time_t shm_atime<span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/* last attach time *\/<\/span><br \/>\n    __kernel_time_t shm_dtime<span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/* last detach time *\/<\/span><br \/>\n    __kernel_time_t shm_ctime<span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/* last change time *\/<\/span><br \/>\n    __kernel_ipc_pid_t shm_cpid<span class=\"token punctuation\">;<\/span>       <span class=\"token comment\">\/* pid of creator *\/<\/span><br \/>\n    __kernel_ipc_pid_t shm_lpid<span class=\"token punctuation\">;<\/span>       <span class=\"token comment\">\/* pid of last operator *\/<\/span><br \/>\n    <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">short<\/span> shm_nattch<span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/* no. of current attaches *\/<\/span><br \/>\n    <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">short<\/span> shm_unused<span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/* compatibility *\/<\/span><br \/>\n    <span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span>shm_unused2<span class=\"token punctuation\">;<\/span>                 <span class=\"token comment\">\/* ditto &#8211; used by DIPC *\/<\/span><br \/>\n    <span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span>shm_unused3<span class=\"token punctuation\">;<\/span>                 <span class=\"token comment\">\/* unused *\/<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>5-3 \u5171\u4eab\u5185\u5b58\u51fd\u6570<\/h4>\n<h5>shmget \u51fd\u6570<\/h5>\n<p>\u529f\u80fd&#xff1a; \u7528\u6765\u521b\u5efa\u5171\u4eab\u5185\u5b58\u3002<\/p>\n<p>\u539f\u578b&#xff1a;<\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">shmget<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">key_t<\/span> key<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">size_t<\/span> size<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> shmflg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u53c2\u6570&#xff1a;<\/p>\n<ul>\n<li>key&#xff1a;\u8fd9\u4e2a\u5171\u4eab\u5185\u5b58\u6bb5\u7684\u540d\u5b57\u3002<\/li>\n<li>size&#xff1a;\u5171\u4eab\u5185\u5b58\u5927\u5c0f\u3002<\/li>\n<li>shmflg&#xff1a;\u7531\u4e5d\u4e2a\u6743\u9650\u6807\u5fd7\u6784\u6210&#xff0c;\u5b83\u4eec\u7684\u7528\u6cd5\u548c\u521b\u5efa\u6587\u4ef6\u65f6\u4f7f\u7528\u7684 mode \u6a21\u5f0f\u6807\u5fd7\u4e00\u6837\u3002\n<ul>\n<li>\u53d6\u503c\u4e3a IPC_CREAT&#xff1a;\u5171\u4eab\u5185\u5b58\u4e0d\u5b58\u5728\u65f6\u521b\u5efa\u5e76\u8fd4\u56de&#xff1b;\u5171\u4eab\u5185\u5b58\u5df2\u5b58\u5728\u65f6\u83b7\u53d6\u5e76\u8fd4\u56de\u3002<\/li>\n<li>\u53d6\u503c\u4e3a IPC_CREAT | IPC_EXCL&#xff1a;\u5171\u4eab\u5185\u5b58\u4e0d\u5b58\u5728\u65f6\u521b\u5efa\u5e76\u8fd4\u56de&#xff1b;\u5171\u4eab\u5185\u5b58\u5df2\u5b58\u5728\u65f6\u51fa\u9519\u8fd4\u56de\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u8fd4\u56de\u503c&#xff1a; \u6210\u529f\u8fd4\u56de\u4e00\u4e2a\u975e\u8d1f\u6574\u6570&#xff0c;\u5373\u8be5\u5171\u4eab\u5185\u5b58\u6bb5\u7684\u6807\u8bc6\u7801&#xff1b;\u5931\u8d25\u8fd4\u56de -1\u3002<\/p>\n<h5>shmat \u51fd\u6570<\/h5>\n<p>\u529f\u80fd&#xff1a; \u5c06\u5171\u4eab\u5185\u5b58\u6bb5\u8fde\u63a5\u5230\u8fdb\u7a0b\u5730\u5740\u7a7a\u95f4\u3002<\/p>\n<p>\u539f\u578b&#xff1a;<\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span><span class=\"token function\">shmat<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> shmid<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span>shmaddr<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> shmflg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u53c2\u6570&#xff1a;<\/p>\n<ul>\n<li>shmid&#xff1a;\u5171\u4eab\u5185\u5b58\u6807\u8bc6\u3002<\/li>\n<li>shmaddr&#xff1a;\u6307\u5b9a\u8fde\u63a5\u7684\u5730\u5740\u3002<\/li>\n<li>shmflg&#xff1a;\u5b83\u7684\u4e24\u4e2a\u53ef\u80fd\u53d6\u503c\u662f SHM_RND \u548c SHM_RDONLY\u3002<\/li>\n<\/ul>\n<p>\u8fd4\u56de\u503c&#xff1a; \u6210\u529f\u8fd4\u56de\u4e00\u4e2a\u6307\u9488&#xff0c;\u6307\u5411\u5171\u4eab\u5185\u5b58\u7684\u7b2c\u4e00\u4e2a\u5b57\u8282&#xff1b;\u5931\u8d25\u8fd4\u56de (void *)-1\u3002<\/p>\n<p>\u8bf4\u660e&#xff1a;<\/p>\n<ul>\n<li>shmaddr \u4e3a NULL&#xff0c;\u6838\u5fc3\u81ea\u52a8\u9009\u62e9\u4e00\u4e2a\u5730\u5740\u3002<\/li>\n<li>shmaddr \u4e0d\u4e3a NULL \u4e14 shmflg \u65e0 SHM_RND \u6807\u8bb0&#xff0c;\u5219\u4ee5 shmaddr \u4e3a\u8fde\u63a5\u5730\u5740\u3002<\/li>\n<li>shmaddr \u4e0d\u4e3a NULL \u4e14 shmflg \u8bbe\u7f6e\u4e86 SHM_RND \u6807\u8bb0&#xff0c;\u5219\u8fde\u63a5\u7684\u5730\u5740\u4f1a\u81ea\u52a8\u5411\u4e0b\u8c03\u6574\u4e3a SHMLBA \u7684\u6574\u6570\u500d\u3002\u516c\u5f0f&#xff1a;shmaddr &#8211; (shmaddr % SHMLBA)\u3002<\/li>\n<li>shmflg &#061; SHM_RDONLY&#xff0c;\u8868\u793a\u8fde\u63a5\u64cd\u4f5c\u7528\u4e8e\u53ea\u8bfb\u5171\u4eab\u5185\u5b58\u3002<\/li>\n<\/ul>\n<h5>shmdt \u51fd\u6570<\/h5>\n<p>\u529f\u80fd&#xff1a; \u5c06\u5171\u4eab\u5185\u5b58\u6bb5\u4e0e\u5f53\u524d\u8fdb\u7a0b\u8131\u79bb\u3002<\/p>\n<p>\u539f\u578b&#xff1a;<\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">shmdt<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span>shmaddr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u53c2\u6570&#xff1a; shmaddr \u4e3a shmat \u6240\u8fd4\u56de\u7684\u6307\u9488\u3002<\/p>\n<p>\u8fd4\u56de\u503c&#xff1a; \u6210\u529f\u8fd4\u56de 0&#xff1b;\u5931\u8d25\u8fd4\u56de -1\u3002<\/p>\n<p>\u6ce8\u610f&#xff1a; \u5c06\u5171\u4eab\u5185\u5b58\u6bb5\u4e0e\u5f53\u524d\u8fdb\u7a0b\u8131\u79bb\u4e0d\u7b49\u4e8e\u5220\u9664\u5171\u4eab\u5185\u5b58\u6bb5\u3002<\/p>\n<h5>shmctl \u51fd\u6570<\/h5>\n<p>\u529f\u80fd&#xff1a; \u7528\u4e8e\u63a7\u5236\u5171\u4eab\u5185\u5b58\u3002<\/p>\n<p>\u539f\u578b&#xff1a;<\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">shmctl<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> shmid<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> cmd<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">shmid_ds<\/span> <span class=\"token operator\">*<\/span>buf<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u53c2\u6570&#xff1a;<\/p>\n<ul>\n<li>shmid&#xff1a;\u7531 shmget \u8fd4\u56de\u7684\u5171\u4eab\u5185\u5b58\u6807\u8bc6\u7801\u3002<\/li>\n<li>cmd&#xff1a;\u5c06\u8981\u91c7\u53d6\u7684\u52a8\u4f5c&#xff08;\u6709\u4e09\u4e2a\u53ef\u53d6\u503c&#xff09;\u3002<\/li>\n<li>buf&#xff1a;\u6307\u5411\u4e00\u4e2a\u4fdd\u5b58\u7740\u5171\u4eab\u5185\u5b58\u7684\u6a21\u5f0f\u72b6\u6001\u548c\u8bbf\u95ee\u6743\u9650\u7684\u6570\u636e\u7ed3\u6784\u3002<\/li>\n<\/ul>\n<p>\u8fd4\u56de\u503c&#xff1a; \u6210\u529f\u8fd4\u56de 0&#xff1b;\u5931\u8d25\u8fd4\u56de -1\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210936-6aea4d9040ed9.png\" alt=\"image.png\" \/><\/p>\n<h4>\u5b9e\u4f8b 1&#xff1a;\u5171\u4eab\u5185\u5b58\u5b9e\u73b0\u901a\u4fe1<\/h4>\n<p>\u6d4b\u8bd5\u4ee3\u7801\u7ed3\u6784&#xff1a;<\/p>\n<p># ls<br \/>\nclient.c  comm.c  comm.h  Makefile  server.c<\/p>\n<p>Makefile&#xff1a;<\/p>\n<p>.PHONY: all<br \/>\nall: server client<\/p>\n<p>client: client.c comm.c<br \/>\ngcc -o $&#064; $^<\/p>\n<p>server: server.c comm.c<br \/>\ngcc -o $&#064; $^<\/p>\n<p>.PHONY: clean<br \/>\nclean:<br \/>\nrm -f client server<\/p>\n<p>comm.h&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifndef<\/span> <span class=\"token expression\">_COMM_H_<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">_COMM_H_<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/ipc.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/shm.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">PATHNAME<\/span> <span class=\"token string\">&#034;.&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">PROJ_ID<\/span> <span class=\"token expression\"><span class=\"token number\">0x6666<\/span><\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">createShm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> size<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">destroyShm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> shmid<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">getShm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> size<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p>comm.c&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;comm.h&#034;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">int<\/span> <span class=\"token function\">commShm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> size<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> flags<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token class-name\">key_t<\/span> key <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ftok<\/span><span class=\"token punctuation\">(<\/span>PATHNAME<span class=\"token punctuation\">,<\/span> PROJ_ID<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>key <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;ftok&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">int<\/span> shmid <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>shmid <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">shmget<\/span><span class=\"token punctuation\">(<\/span>key<span class=\"token punctuation\">,<\/span> size<span class=\"token punctuation\">,<\/span> flags<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;shmget&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> shmid<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">destroyShm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> shmid<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">shmctl<\/span><span class=\"token punctuation\">(<\/span>shmid<span class=\"token punctuation\">,<\/span> IPC_RMID<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;shmctl&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">createShm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> size<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token function\">commShm<\/span><span class=\"token punctuation\">(<\/span>size<span class=\"token punctuation\">,<\/span> IPC_CREAT <span class=\"token operator\">|<\/span> IPC_EXCL <span class=\"token operator\">|<\/span> <span class=\"token number\">0666<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">getShm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> size<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token function\">commShm<\/span><span class=\"token punctuation\">(<\/span>size<span class=\"token punctuation\">,<\/span> IPC_CREAT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>server.c&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;comm.h&#034;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> shmid <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">createShm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">4096<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>addr <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">shmat<\/span><span class=\"token punctuation\">(<\/span>shmid<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">sleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span>i<span class=\"token operator\">&#043;&#043;<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">26<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;client# %s\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">sleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token function\">shmdt<\/span><span class=\"token punctuation\">(<\/span>addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">sleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">destroyShm<\/span><span class=\"token punctuation\">(<\/span>shmid<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>client.c&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;comm.h&#034;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> shmid <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">getShm<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">4096<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">sleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>addr <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">shmat<\/span><span class=\"token punctuation\">(<\/span>shmid<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">sleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span>i <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">26<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        addr<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token char\">&#039;A&#039;<\/span> <span class=\"token operator\">&#043;<\/span> i<span class=\"token punctuation\">;<\/span><br \/>\n        i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        addr<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">sleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token function\">shmdt<\/span><span class=\"token punctuation\">(<\/span>addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">sleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u7ed3\u679c\u6f14\u793a&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210936-6aea4d907a6ec.png\" alt=\"image.png\" \/><\/p>\n<p>Ctrl&#043;C \u7ec8\u6b62\u8fdb\u7a0b&#xff0c;\u518d\u6b21\u91cd\u542f&#xff1a;<\/p>\n<p># .\/server<br \/>\nshmget: File exists<br \/>\n# ipcs -m<br \/>\n&#8212;&#8212; Shared Memory Segments &#8212;&#8212;&#8211;<br \/>\nkey        shmid      owner      perms      bytes      nattch     status<br \/>\n0x66026a25 688145     root       666        4096       0<\/p>\n<p># ipcrm -m 688145<\/p>\n<p>\u5220\u9664\u5171\u4eab\u5185\u5b58 IPC \u8d44\u6e90\u5e76\u4e0d\u662f\u5fc5\u987b\u901a\u8fc7\u624b\u52a8\u547d\u4ee4\u5b8c\u6210&#xff0c;\u8fd9\u91cc\u53ea\u662f\u6f14\u793a\u76f8\u5173\u547d\u4ee4&#xff1b;\u5220\u9664 IPC \u8d44\u6e90\u662f\u8fdb\u7a0b\u8be5\u505a\u7684\u4e8b\u60c5\u3002<\/p>\n<p>bytes \u548c nattch \u6709\u65f6\u95f4\u53ef\u4ee5\u7814\u7a76\u4e00\u4e0b\u3002<\/p>\n<p>\u6ce8\u610f&#xff1a; \u5171\u4eab\u5185\u5b58\u6ca1\u6709\u8fdb\u884c\u540c\u6b65\u4e0e\u4e92\u65a5&#xff0c;\u7f3a\u4e4f\u8bbf\u95ee\u63a7\u5236&#xff0c;\u4f1a\u5e26\u6765\u5e76\u53d1\u95ee\u9898\u3002<\/p>\n<h4>\u5b9e\u4f8b 2&#xff1a;\u501f\u52a9\u7ba1\u9053\u5b9e\u73b0\u8bbf\u95ee\u63a7\u5236\u7248\u7684\u5171\u4eab\u5185\u5b58<\/h4>\n<p>\u6b64\u4f8b\u6709 bug&#xff0c;\u4ec5\u7528\u4e8e\u5e2e\u52a9\u5927\u5bb6\u7406\u89e3\u5982\u4f55\u8ba9\u8fdb\u7a0b\u6267\u884c\u4ea7\u751f\u4e00\u5b9a\u7684\u987a\u5e8f\u6027\u3002<\/p>\n<p>Comm.hpp&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">pragma<\/span> <span class=\"token expression\">once<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;fcntl.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/ipc.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/shm.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/stat.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;cassert&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;cstdio&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;ctime&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;cstring&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">using<\/span> <span class=\"token keyword\">namespace<\/span> std<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">Debug<\/span> <span class=\"token expression\"><span class=\"token number\">0<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">Notice<\/span> <span class=\"token expression\"><span class=\"token number\">1<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">Warning<\/span> <span class=\"token expression\"><span class=\"token number\">2<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">Error<\/span> <span class=\"token expression\"><span class=\"token number\">3<\/span><\/span><\/span><\/p>\n<p><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string msg<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string\">&#034;Debug&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;Notice&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;Warning&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;Error&#034;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>std<span class=\"token double-colon punctuation\">::<\/span>ostream <span class=\"token operator\">&amp;<\/span><span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string message<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> level<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; | &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">unsigned<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">time<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; | &#034;<\/span><br \/>\n              <span class=\"token operator\">&lt;&lt;<\/span> msg<span class=\"token punctuation\">[<\/span>level<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; | &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> message<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span>cout<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">PATH_NAME<\/span> <span class=\"token string\">&#034;\/home\/hyb&#034;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">PROJ_ID<\/span> <span class=\"token expression\"><span class=\"token number\">0x66<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">SHM_SIZE<\/span> <span class=\"token expression\"><span class=\"token number\">4096<\/span>  <\/span><span class=\"token comment\">\/\/ \u5171\u4eab\u5185\u5b58\u7684\u5927\u5c0f&#xff0c;\u6700\u597d\u662f\u9875&#xff08;PAGE&#xff1a;4096&#xff09;\u7684\u6574\u6570\u500d<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">FIFO_NAME<\/span> <span class=\"token string\">&#034;.\/fifo&#034;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Init<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">public<\/span><span class=\"token operator\">:<\/span><br \/>\n    <span class=\"token function\">Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">umask<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">mkfifo<\/span><span class=\"token punctuation\">(<\/span>FIFO_NAME<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0666<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">assert<\/span><span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span>n<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;create fifo success&#034;<\/span><span class=\"token punctuation\">,<\/span> Notice<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token operator\">~<\/span><span class=\"token function\">Init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">unlink<\/span><span class=\"token punctuation\">(<\/span>FIFO_NAME<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;remove fifo success&#034;<\/span><span class=\"token punctuation\">,<\/span> Notice<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">READ<\/span> <span class=\"token expression\">O_RDONLY<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">WRITE<\/span> <span class=\"token expression\">O_WRONLY<\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">OpenFIFO<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string pathname<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> flags<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> fd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">open<\/span><span class=\"token punctuation\">(<\/span>pathname<span class=\"token punctuation\">.<\/span><span class=\"token function\">c_str<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> flags<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">assert<\/span><span class=\"token punctuation\">(<\/span>fd <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> fd<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">CloseFifo<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">Wait<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u7b49\u5f85\u4e2d&#8230;.&#034;<\/span><span class=\"token punctuation\">,<\/span> Notice<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">uint32_t<\/span> temp <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    ssize_t s <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">read<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>temp<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">uint32_t<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">assert<\/span><span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">uint32_t<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span>s<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">Signal<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> fd<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">uint32_t<\/span> temp <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    ssize_t s <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">write<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>temp<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">uint32_t<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">assert<\/span><span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">uint32_t<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span>s<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u5524\u9192\u4e2d&#8230;.&#034;<\/span><span class=\"token punctuation\">,<\/span> Notice<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>string <span class=\"token function\">TransToHex<\/span><span class=\"token punctuation\">(<\/span>key_t k<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> buffer<span class=\"token punctuation\">[<\/span><span class=\"token number\">32<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">snprintf<\/span><span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span> buffer<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;0x%x&#034;<\/span><span class=\"token punctuation\">,<\/span> k<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> buffer<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h5>ShmServer.cc<\/h5>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;Comm.hpp&#034;<\/span><\/span><\/p>\n<p>Init init<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u521b\u5efa\u516c\u5171\u7684 Key \u503c<\/span><br \/>\n    key_t k <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ftok<\/span><span class=\"token punctuation\">(<\/span>PATH_NAME<span class=\"token punctuation\">,<\/span> PROJ_ID<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">assert<\/span><span class=\"token punctuation\">(<\/span>k <span class=\"token operator\">!&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;create key done&#034;<\/span><span class=\"token punctuation\">,<\/span> Debug<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; server key : &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token function\">TransToHex<\/span><span class=\"token punctuation\">(<\/span>k<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u521b\u5efa\u5171\u4eab\u5185\u5b58 &#8212; \u5efa\u8bae\u521b\u5efa\u4e00\u4e2a\u5168\u65b0\u7684\u5171\u4eab\u5185\u5b58 &#8212; \u901a\u4fe1\u7684\u53d1\u8d77\u8005<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> shmid <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">shmget<\/span><span class=\"token punctuation\">(<\/span>k<span class=\"token punctuation\">,<\/span> SHM_SIZE<span class=\"token punctuation\">,<\/span> IPC_CREAT <span class=\"token operator\">|<\/span> IPC_EXCL <span class=\"token operator\">|<\/span> <span class=\"token number\">0666<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>shmid <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;shmget&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;create shm done&#034;<\/span><span class=\"token punctuation\">,<\/span> Debug<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; shmid : &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> shmid <span class=\"token operator\">&lt;&lt;<\/span> endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u5c06\u6307\u5b9a\u7684\u5171\u4eab\u5185\u5b58\u6302\u63a5\u5230\u81ea\u5df1\u7684\u5730\u5740\u7a7a\u95f4<\/span><br \/>\n    <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> shmaddr <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">shmat<\/span><span class=\"token punctuation\">(<\/span>shmid<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;attach shm done&#034;<\/span><span class=\"token punctuation\">,<\/span> Debug<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; shmid : &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> shmid <span class=\"token operator\">&lt;&lt;<\/span> endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 4. \u8bbf\u95ee\u63a7\u5236<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> fd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">OpenFIFO<\/span><span class=\"token punctuation\">(<\/span>FIFO_NAME<span class=\"token punctuation\">,<\/span> O_RDONLY<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u963b\u585e<\/span><br \/>\n        <span class=\"token function\">Wait<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u4e34\u754c\u533a<\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;%s\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> shmaddr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">strcmp<\/span><span class=\"token punctuation\">(<\/span>shmaddr<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;quit&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token function\">CloseFifo<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 5. \u5c06\u6307\u5b9a\u7684\u5171\u4eab\u5185\u5b58\u4ece\u81ea\u5df1\u7684\u5730\u5740\u7a7a\u95f4\u4e2d\u53bb\u5173\u8054<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">shmdt<\/span><span class=\"token punctuation\">(<\/span>shmaddr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">assert<\/span><span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">!&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span>n<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;detach shm done&#034;<\/span><span class=\"token punctuation\">,<\/span> Debug<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; shmid : &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> shmid <span class=\"token operator\">&lt;&lt;<\/span> endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 6. \u5220\u9664\u5171\u4eab\u5185\u5b58&#xff0c;IPC_RMID \u5373\u4fbf\u662f\u6709\u8fdb\u7a0b\u548c\u5f53\u4e0b\u7684 shm \u6302\u63a5&#xff0c;\u4f9d\u65e7\u5220\u9664\u5171\u4eab\u5185\u5b58<\/span><br \/>\n    n <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">shmctl<\/span><span class=\"token punctuation\">(<\/span>shmid<span class=\"token punctuation\">,<\/span> IPC_RMID<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">assert<\/span><span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">!&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span>n<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;delete shm done&#034;<\/span><span class=\"token punctuation\">,<\/span> Debug<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; shmid : &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> shmid <span class=\"token operator\">&lt;&lt;<\/span> endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h5>ShmClient.cc<\/h5>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&#034;Comm.hpp&#034;<\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u521b\u5efa\u516c\u5171\u7684 Key \u503c<\/span><br \/>\n    key_t k <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">ftok<\/span><span class=\"token punctuation\">(<\/span>PATH_NAME<span class=\"token punctuation\">,<\/span> PROJ_ID<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>k <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;create key failed&#034;<\/span><span class=\"token punctuation\">,<\/span> Error<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; client key : &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token function\">TransToHex<\/span><span class=\"token punctuation\">(<\/span>k<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> endl<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;create key done&#034;<\/span><span class=\"token punctuation\">,<\/span> Debug<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; client key : &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token function\">TransToHex<\/span><span class=\"token punctuation\">(<\/span>k<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u83b7\u53d6\u5171\u4eab\u5185\u5b58<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> shmid <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">shmget<\/span><span class=\"token punctuation\">(<\/span>k<span class=\"token punctuation\">,<\/span> SHM_SIZE<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>shmid <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;create shm failed&#034;<\/span><span class=\"token punctuation\">,<\/span> Error<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; client key : &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token function\">TransToHex<\/span><span class=\"token punctuation\">(<\/span>k<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> endl<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;create shm success&#034;<\/span><span class=\"token punctuation\">,<\/span> Error<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; client key : &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token function\">TransToHex<\/span><span class=\"token punctuation\">(<\/span>k<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u6302\u63a5\u5171\u4eab\u5185\u5b58<\/span><br \/>\n    <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> shmaddr <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">shmat<\/span><span class=\"token punctuation\">(<\/span>shmid<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">nullptr<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>shmaddr <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;attach shm failed&#034;<\/span><span class=\"token punctuation\">,<\/span> Error<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; client key : &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token function\">TransToHex<\/span><span class=\"token punctuation\">(<\/span>k<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> endl<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;attach shm success&#034;<\/span><span class=\"token punctuation\">,<\/span> Error<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; client key : &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token function\">TransToHex<\/span><span class=\"token punctuation\">(<\/span>k<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> endl<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 4. \u5199<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> fd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">OpenFIFO<\/span><span class=\"token punctuation\">(<\/span>FIFO_NAME<span class=\"token punctuation\">,<\/span> O_WRONLY<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token boolean\">true<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        ssize_t s <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">read<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> shmaddr<span class=\"token punctuation\">,<\/span> SHM_SIZE <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            shmaddr<span class=\"token punctuation\">[<\/span>s <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">Signal<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">strcmp<\/span><span class=\"token punctuation\">(<\/span>shmaddr<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;quit&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token function\">CloseFifo<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 5. \u53bb\u5173\u8054<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> n <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">shmdt<\/span><span class=\"token punctuation\">(<\/span>shmaddr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">assert<\/span><span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">!&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">Log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;detach shm success&#034;<\/span><span class=\"token punctuation\">,<\/span> Error<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034; client key : &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token function\">TransToHex<\/span><span class=\"token punctuation\">(<\/span>k<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> endl<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>6. System V \u6d88\u606f\u961f\u5217&#xff08;\u4e86\u89e3\u5373\u53ef&#xff09;<\/h3>\n<ul>\n<li>\u6d88\u606f\u961f\u5217\u63d0\u4f9b\u4e86\u4e00\u4e2a\u4ece\u4e00\u4e2a\u8fdb\u7a0b\u5411\u53e6\u5916\u4e00\u4e2a\u8fdb\u7a0b\u53d1\u9001\u4e00\u5757\u6570\u636e\u7684\u65b9\u6cd5\u3002<\/li>\n<li>\u6bcf\u4e2a\u6570\u636e\u5757\u90fd\u88ab\u8ba4\u4e3a\u6709\u4e00\u4e2a\u7c7b\u578b&#xff0c;\u63a5\u6536\u8005\u8fdb\u7a0b\u63a5\u6536\u7684\u6570\u636e\u5757\u53ef\u4ee5\u6709\u4e0d\u540c\u7684\u7c7b\u578b\u503c\u3002<\/li>\n<li>\u7279\u6027\u65b9\u9762&#xff1a;\n<ul>\n<li>IPC \u8d44\u6e90\u5fc5\u987b\u5220\u9664&#xff0c;\u5426\u5219\u4e0d\u4f1a\u81ea\u52a8\u6e05\u9664&#xff0c;\u9664\u975e\u91cd\u542f&#xff0c;\u6240\u4ee5 System V IPC \u8d44\u6e90\u7684\u751f\u547d\u5468\u671f\u968f\u5185\u6838\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>7. System V \u4fe1\u53f7\u91cf&#xff08;\u4e86\u89e3\u5373\u53ef&#xff09;<\/h3>\n<p>\u4fe1\u53f7\u91cf\u4e3b\u8981\u7528\u4e8e\u540c\u6b65\u548c\u4e92\u65a5&#xff0c;\u4e0b\u9762\u5148\u6765\u770b\u770b\u4ec0\u4e48\u662f\u540c\u6b65\u548c\u4e92\u65a5\u3002<\/p>\n<h4>7-1 \u5e76\u53d1\u7f16\u7a0b&#xff0c;\u6982\u5ff5\u94fa\u57ab<\/h4>\n<ul>\n<li>\u591a\u4e2a\u6267\u884c\u6d41&#xff08;\u8fdb\u7a0b&#xff09;\u80fd\u770b\u5230\u7684\u540c\u4e00\u4efd\u516c\u5171\u8d44\u6e90&#xff1a;\u5171\u4eab\u8d44\u6e90\u3002<\/li>\n<li>\u88ab\u4fdd\u62a4\u8d77\u6765\u7684\u5171\u4eab\u8d44\u6e90\u53eb\u505a\u4e34\u754c\u8d44\u6e90\u3002<\/li>\n<li>\u4fdd\u62a4\u7684\u65b9\u5f0f\u5e38\u89c1&#xff1a;\u4e92\u65a5\u4e0e\u540c\u6b65\u3002<\/li>\n<li>\u4efb\u4f55\u65f6\u523b&#xff0c;\u53ea\u5141\u8bb8\u4e00\u4e2a\u6267\u884c\u6d41\u8bbf\u95ee\u8d44\u6e90&#xff0c;\u53eb\u505a\u4e92\u65a5\u3002<\/li>\n<li>\u591a\u4e2a\u6267\u884c\u6d41\u8bbf\u95ee\u4e34\u754c\u8d44\u6e90\u7684\u65f6\u5019&#xff0c;\u5177\u6709\u4e00\u5b9a\u7684\u987a\u5e8f\u6027&#xff0c;\u53eb\u505a\u540c\u6b65\u3002<\/li>\n<li>\u7cfb\u7edf\u4e2d\u67d0\u4e9b\u8d44\u6e90\u4e00\u6b21\u53ea\u5141\u8bb8\u4e00\u4e2a\u8fdb\u7a0b\u4f7f\u7528&#xff0c;\u79f0\u8fd9\u6837\u7684\u8d44\u6e90\u4e3a\u4e34\u754c\u8d44\u6e90\u6216\u4e92\u65a5\u8d44\u6e90\u3002<\/li>\n<li>\u5728\u8fdb\u7a0b\u4e2d\u6d89\u53ca\u4e92\u65a5\u8d44\u6e90\u7684\u7a0b\u5e8f\u6bb5\u53eb\u4e34\u754c\u533a\u3002\u4f60\u5199\u7684\u4ee3\u7801 &#061; \u8bbf\u95ee\u4e34\u754c\u8d44\u6e90\u7684\u4ee3\u7801&#xff08;\u4e34\u754c\u533a&#xff09;&#043; \u4e0d\u8bbf\u95ee\u4e34\u754c\u8d44\u6e90\u7684\u4ee3\u7801&#xff08;\u975e\u4e34\u754c\u533a&#xff09;\u3002<\/li>\n<li>\u6240\u8c13\u5bf9\u5171\u4eab\u8d44\u6e90\u8fdb\u884c\u4fdd\u62a4&#xff0c;\u672c\u8d28\u662f\u5bf9\u8bbf\u95ee\u5171\u4eab\u8d44\u6e90\u7684\u4ee3\u7801\u8fdb\u884c\u4fdd\u62a4\u3002<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210936-6aea4d90c033c.png\" alt=\"image.png\" \/><\/p>\n<h4>7-2 \u4fe1\u53f7\u91cf<\/h4>\n<p>\u7279\u6027\u65b9\u9762<\/p>\n<ul>\n<li>IPC \u8d44\u6e90\u5fc5\u987b\u5220\u9664&#xff0c;\u5426\u5219\u4e0d\u4f1a\u81ea\u52a8\u6e05\u9664&#xff0c;\u9664\u975e\u91cd\u542f&#xff0c;\u6240\u4ee5 System V IPC \u8d44\u6e90\u7684\u751f\u547d\u5468\u671f\u968f\u5185\u6838\u3002<\/li>\n<\/ul>\n<p>\u7406\u89e3\u65b9\u9762<\/p>\n<ul>\n<li>\u4fe1\u53f7\u91cf\u662f\u4e00\u4e2a\u8ba1\u6570\u5668\u3002<\/li>\n<\/ul>\n<p>\u4f5c\u7528\u65b9\u9762<\/p>\n<ul>\n<li>\u4fdd\u62a4\u4e34\u754c\u533a\u3002<\/li>\n<\/ul>\n<p>\u672c\u8d28\u65b9\u9762<\/p>\n<ul>\n<li>\u4fe1\u53f7\u91cf\u672c\u8d28\u662f\u5bf9\u8d44\u6e90\u7684\u9884\u8ba2\u673a\u5236\u3002<\/li>\n<\/ul>\n<p>\u64cd\u4f5c\u65b9\u9762<\/p>\n<ul>\n<li>\u7533\u8bf7\u8d44\u6e90&#xff0c;\u8ba1\u6570\u5668 &#8211;&#xff0c;P \u64cd\u4f5c\u3002<\/li>\n<li>\u91ca\u653e\u8d44\u6e90&#xff0c;\u8ba1\u6570\u5668 &#043;&#043;&#xff0c;V \u64cd\u4f5c\u3002<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210938-6aea4d92bb839.png\" alt=\"image.png\" \/><\/p>\n<h3>8. \u5185\u6838\u662f\u5982\u4f55\u7ec4\u7ec7\u7ba1\u7406 IPC \u8d44\u6e90\u7684<\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210940-6aea4d9406656.png\" alt=\"image.png\" \/><\/p>\n<ul>\n<li>\u53c2\u8003 Linux \u5185\u6838 2.6.11 \u6e90\u7801&#xff0c;\u5176\u4ed6\u6e90\u7801\u5b9e\u73b0\u53ef\u80fd\u6709\u5dee\u522b\u3002<\/li>\n<li>\u4e5f\u53ef\u4ee5\u770b 2.6.18&#xff0c;\u8fd9\u5757\u4ece 11 \u5230 18 \u53d8\u5316\u4e0d\u5927\u3002<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210941-6aea4d95a1a6c.png\" alt=\"image.png\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210942-6aea4d96c6f0e.png\" alt=\"image.png\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210942-6aea4d96d7fed.png\" alt=\"image.png\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210942-6aea4d96f06d5.png\" alt=\"image.png\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210943-6aea4d9756723.png\" alt=\"image.png\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210943-6aea4d9797e3e.png\" alt=\"image.png\" \/><\/p>\n<h3>\u9644\u5f55<\/h3>\n<ul>\n<li>\u5728 minishell \u4e2d\u6dfb\u52a0\u7ba1\u9053\u7684\u5b9e\u73b0&#xff0c;\u5927\u5bb6\u6709\u5174\u8da3\u7684\u8bdd&#xff0c;\u53c2\u8003\u4e0b\u9762\u4ee3\u7801\u3002<\/li>\n<\/ul>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdlib.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;fcntl.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">MAX_CMD<\/span> <span class=\"token expression\"><span class=\"token number\">1024<\/span><\/span><\/span><\/p>\n<p><span class=\"token keyword\">char<\/span> command<span class=\"token punctuation\">[<\/span>MAX_CMD<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">do_face<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span>command<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0x00<\/span><span class=\"token punctuation\">,<\/span> MAX_CMD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;minishell$ &#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">fflush<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">stdout<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">scanf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;%[^\\\\n]%*c&#034;<\/span><span class=\"token punctuation\">,<\/span> command<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">getchar<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span><span class=\"token function\">do_parse<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>buff<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> argc <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">static<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>argv<span class=\"token punctuation\">[<\/span><span class=\"token number\">32<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>ptr <span class=\"token operator\">&#061;<\/span> buff<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>ptr <span class=\"token operator\">!&#061;<\/span> <span class=\"token char\">&#039;\\\\0&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">isspace<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>ptr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            argv<span class=\"token punctuation\">[<\/span>argc<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> ptr<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">isspace<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>ptr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>ptr<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> <span class=\"token char\">&#039;\\\\0&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                ptr<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token operator\">*<\/span>ptr <span class=\"token operator\">&#061;<\/span> <span class=\"token char\">&#039;\\\\0&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        ptr<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    argv<span class=\"token punctuation\">[<\/span>argc<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> argv<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">do_redirect<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>buff<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>ptr <span class=\"token operator\">&#061;<\/span> buff<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">*<\/span>file <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> type <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> fd<span class=\"token punctuation\">,<\/span> redirect_type <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>ptr <span class=\"token operator\">!&#061;<\/span> <span class=\"token char\">&#039;\\\\0&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>ptr <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token char\">&#039;&gt;&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token operator\">*<\/span>ptr<span class=\"token operator\">&#043;&#043;<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token char\">&#039;\\\\0&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            redirect_type<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>ptr <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token char\">&#039;&gt;&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token operator\">*<\/span>ptr<span class=\"token operator\">&#043;&#043;<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token char\">&#039;\\\\0&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                redirect_type<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">isspace<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>ptr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                ptr<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            file <span class=\"token operator\">&#061;<\/span> ptr<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token function\">isspace<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>ptr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token operator\">*<\/span>ptr <span class=\"token operator\">!&#061;<\/span> <span class=\"token char\">&#039;\\\\0&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                ptr<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token operator\">*<\/span>ptr <span class=\"token operator\">&#061;<\/span> <span class=\"token char\">&#039;\\\\0&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>redirect_type <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                fd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">open<\/span><span class=\"token punctuation\">(<\/span>file<span class=\"token punctuation\">,<\/span> O_CREAT <span class=\"token operator\">|<\/span> O_TRUNC <span class=\"token operator\">|<\/span> O_WRONLY<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0664<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                fd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">open<\/span><span class=\"token punctuation\">(<\/span>file<span class=\"token punctuation\">,<\/span> O_CREAT <span class=\"token operator\">|<\/span> O_APPEND <span class=\"token operator\">|<\/span> O_WRONLY<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0664<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token function\">dup2<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        ptr<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">do_command<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>buff<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> pipe_num <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> i<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>ptr <span class=\"token operator\">&#061;<\/span> buff<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> pipefd<span class=\"token punctuation\">[<\/span><span class=\"token number\">32<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> pid <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    pipe_command<span class=\"token punctuation\">[<\/span>pipe_num<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> ptr<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>ptr <span class=\"token operator\">!&#061;<\/span> <span class=\"token char\">&#039;\\\\0&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>ptr <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token char\">&#039;|&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            pipe_num<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token operator\">*<\/span>ptr<span class=\"token operator\">&#043;&#043;<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token char\">&#039;\\\\0&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            pipe_command<span class=\"token punctuation\">[<\/span>pipe_num<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> ptr<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        ptr<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    pipe_command<span class=\"token punctuation\">[<\/span>pipe_num <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> pipe_num<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">do_pipe<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> pipe_num<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> pid <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> i<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> pipefd<span class=\"token punctuation\">[<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <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><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span>argv <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;&#061;<\/span> pipe_num<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">pipe<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;&#061;<\/span> pipe_num<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        pid <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">fork<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>pid <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">do_redirect<\/span><span class=\"token punctuation\">(<\/span>pipe_command<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            argv <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">do_parse<\/span><span class=\"token punctuation\">(<\/span>pipe_command<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>i <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token function\">dup2<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span>i<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> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>i <span class=\"token operator\">!&#061;<\/span> pipe_num<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span>i <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><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><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token function\">dup2<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span>i <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token function\">execvp<\/span><span class=\"token punctuation\">(<\/span>argv<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> argv<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span>i<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><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>pipefd<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">waitpid<\/span><span class=\"token punctuation\">(<\/span>pid<span class=\"token punctuation\">,<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> argc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>argv<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> num <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">do_face<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        num <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">do_command<\/span><span class=\"token punctuation\">(<\/span>command<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">do_pipe<\/span><span class=\"token punctuation\">(<\/span>num<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u76ee\u5f55<br \/>\n\u672c\u8282\u91cd\u70b91. \u8fdb\u7a0b\u95f4\u901a\u4fe1\u4ecb\u7ecd2. \u7ba1\u90533. \u533f\u540d\u7ba1\u90534. \u547d\u540d\u7ba1\u90535. System V \u5171\u4eab\u5185\u5b586. System V \u6d88\u606f\u961f\u5217&#xff08;\u9009\u5b66\u4e86\u89e3\u5373\u53ef&#xff09;7. System V \u4fe1\u53f7\u91cf&#xff08;\u9009\u5b66\u4e86\u89e3\u5373\u53ef&#xff09;8. \u5185\u6838\u662f\u5982\u4f55\u7ec4\u7ec7\u7ba1\u7406 IPC \u8d44\u6e90\u7684\u9644\u5f55<br \/>\n\u672c\u8282\u91cd\u70b9<br \/>\n\u8fdb\u7a0b\u95f4\u901a\u4fe1\u4ecb\u7ecd\u638c\u63e1\u533f\u540d\u3001\u547d\u540d\u7ba1\u9053\u539f\u7406\u53ca\u64cd\u4f5c\u7f16\u5199\u8fdb\u7a0b\u6c60\u638c\u63e1\u5171\u4eab\u5185\u5b58\u4e86\u89e3\u6d88\u606f\u961f\u5217\u4e86\u89e3\u4fe1\u53f7\u91cf\u7406\u89e3\u5185\u6838\u7ba1\u7406 IPC \u8d44\u6e90\u7684\u65b9\u5f0f&#xff0c;\u4e86\u89e3 C \u5b9e\u73b0\u591a\u6001<br \/>\n1. \u8fdb<\/p>\n","protected":false},"author":2,"featured_media":121986,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[58,1714],"topic":[],"class_list":["post-122006","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-linux","tag-1714"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u7b2c8\u8bb2\uff1a\u8fdb\u7a0b\u95f4\u901a\u4fe1 - \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\/122006.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u7b2c8\u8bb2\uff1a\u8fdb\u7a0b\u95f4\u901a\u4fe1 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u76ee\u5f55 \u672c\u8282\u91cd\u70b91. \u8fdb\u7a0b\u95f4\u901a\u4fe1\u4ecb\u7ecd2. \u7ba1\u90533. \u533f\u540d\u7ba1\u90534. \u547d\u540d\u7ba1\u90535. System V \u5171\u4eab\u5185\u5b586. System V \u6d88\u606f\u961f\u5217&#xff08;\u9009\u5b66\u4e86\u89e3\u5373\u53ef&#xff09;7. System V \u4fe1\u53f7\u91cf&#xff08;\u9009\u5b66\u4e86\u89e3\u5373\u53ef&#xff09;8. \u5185\u6838\u662f\u5982\u4f55\u7ec4\u7ec7\u7ba1\u7406 IPC \u8d44\u6e90\u7684\u9644\u5f55 \u672c\u8282\u91cd\u70b9 \u8fdb\u7a0b\u95f4\u901a\u4fe1\u4ecb\u7ecd\u638c\u63e1\u533f\u540d\u3001\u547d\u540d\u7ba1\u9053\u539f\u7406\u53ca\u64cd\u4f5c\u7f16\u5199\u8fdb\u7a0b\u6c60\u638c\u63e1\u5171\u4eab\u5185\u5b58\u4e86\u89e3\u6d88\u606f\u961f\u5217\u4e86\u89e3\u4fe1\u53f7\u91cf\u7406\u89e3\u5185\u6838\u7ba1\u7406 IPC \u8d44\u6e90\u7684\u65b9\u5f0f&#xff0c;\u4e86\u89e3 C \u5b9e\u73b0\u591a\u6001 1. \u8fdb\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/122006.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-03T21:09:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210932-6aea4d8cccece.png\" \/>\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=\"17 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/122006.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/122006.html\",\"name\":\"\u7b2c8\u8bb2\uff1a\u8fdb\u7a0b\u95f4\u901a\u4fe1 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-11-03T21:09:44+00:00\",\"dateModified\":\"2026-11-03T21:09:44+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/122006.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/122006.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/122006.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u7b2c8\u8bb2\uff1a\u8fdb\u7a0b\u95f4\u901a\u4fe1\"}]},{\"@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":"\u7b2c8\u8bb2\uff1a\u8fdb\u7a0b\u95f4\u901a\u4fe1 - \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\/122006.html","og_locale":"zh_CN","og_type":"article","og_title":"\u7b2c8\u8bb2\uff1a\u8fdb\u7a0b\u95f4\u901a\u4fe1 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u76ee\u5f55 \u672c\u8282\u91cd\u70b91. \u8fdb\u7a0b\u95f4\u901a\u4fe1\u4ecb\u7ecd2. \u7ba1\u90533. \u533f\u540d\u7ba1\u90534. \u547d\u540d\u7ba1\u90535. System V \u5171\u4eab\u5185\u5b586. System V \u6d88\u606f\u961f\u5217&#xff08;\u9009\u5b66\u4e86\u89e3\u5373\u53ef&#xff09;7. System V \u4fe1\u53f7\u91cf&#xff08;\u9009\u5b66\u4e86\u89e3\u5373\u53ef&#xff09;8. \u5185\u6838\u662f\u5982\u4f55\u7ec4\u7ec7\u7ba1\u7406 IPC \u8d44\u6e90\u7684\u9644\u5f55 \u672c\u8282\u91cd\u70b9 \u8fdb\u7a0b\u95f4\u901a\u4fe1\u4ecb\u7ecd\u638c\u63e1\u533f\u540d\u3001\u547d\u540d\u7ba1\u9053\u539f\u7406\u53ca\u64cd\u4f5c\u7f16\u5199\u8fdb\u7a0b\u6c60\u638c\u63e1\u5171\u4eab\u5185\u5b58\u4e86\u89e3\u6d88\u606f\u961f\u5217\u4e86\u89e3\u4fe1\u53f7\u91cf\u7406\u89e3\u5185\u6838\u7ba1\u7406 IPC \u8d44\u6e90\u7684\u65b9\u5f0f&#xff0c;\u4e86\u89e3 C \u5b9e\u73b0\u591a\u6001 1. \u8fdb","og_url":"https:\/\/www.wsisp.com\/helps\/122006.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-11-03T21:09:44+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261103210932-6aea4d8cccece.png"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"17 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/122006.html","url":"https:\/\/www.wsisp.com\/helps\/122006.html","name":"\u7b2c8\u8bb2\uff1a\u8fdb\u7a0b\u95f4\u901a\u4fe1 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-11-03T21:09:44+00:00","dateModified":"2026-11-03T21:09:44+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/122006.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/122006.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/122006.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u7b2c8\u8bb2\uff1a\u8fdb\u7a0b\u95f4\u901a\u4fe1"}]},{"@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\/122006","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=122006"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/122006\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/121986"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=122006"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=122006"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=122006"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=122006"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}