吴北北 發表於 2023-9-21 00:00:00

linux 命名管道实例详解

<p>
        <strong><span>linux进程间通信——命名管道</span></strong></p>
<p>
        <span>  fifo(命名管道)不同于匿名管道之处在于它提供⼀个路径名与之关联,以fifo的⽂件形式存储于⽂件系统中。命名管道是⼀个设备⽂件,因此,即使进程与创建fifo的进程不存在亲缘关系,只要可以访问该路径,就能够通过fifo相互通信。值得注意的是,fifo(first input first output)总是按照先进先出的原则⼯作,第⼀个被写⼊的数据将⾸先从管道中读出。</span></p>
<p>
        <span>  创建命名管道的系统函数有两个:mknod和mkfifo。两个函数均定义在头⽂件sys/stat.h,函数原型如下:</span></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_67536">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;sys/types.h&gt; </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;sys/stat.h&gt; </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">mknod(</code><code class="cpp keyword bold">const</code> <code class="cpp color1 bold">char</code> <code class="cpp plain">*path,mode_t mod,dev_t dev); </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">mkfifo(</code><code class="cpp keyword bold">const</code> <code class="cpp color1 bold">char</code> <code class="cpp plain">*path,mode_t mode);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
           函数mknod参数中path为创建的命名管道的全路径名:mod为创建的命名管道的模式,指明其存取权限;dev为设备值,该值取决于⽂件创建的种类,它只在创建设备⽂件时才会⽤到。这两个函数调⽤成功都返回0,失败都返回-1。下⾯使⽤mknod函数创建了⼀个命名管道:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_273253">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp plain">umask(0);</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                         </div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp keyword bold">if</code> <code class="cpp plain">(mknod(</code><code class="cpp string">"/tmp/fifo"</code><code class="cpp plain">,s_ififo | 0666) == -1)</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                         </div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp plain">{</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                         </div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"mkfifo error"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                         </div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp functions bold">exit</code><code class="cpp plain">(1);</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                         </div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp plain">} </code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <span> 函数mkfifo前两个参数的含义和mknod相同。下⾯是使⽤mkfifo的⽰例代码:</span></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_855880">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp plain">umask(0);</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                         </div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp keyword bold">if</code> <code class="cpp plain">(mkfifo(</code><code class="cpp string">"/tmp/fifo"</code><code class="cpp plain">,s_ififo|0666) == -1)</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                         </div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp plain">{</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                         </div>
                                                                <div class="line number7 index6 alt2">
                                                                         </div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"mkfifo error!"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                         </div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp functions bold">exit</code><code class="cpp plain">(1);</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                         </div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <span>下面为一个试例:</span></p>
<p>
        <strong><span>read端</span></strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_602303">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                        <div class="line number25 index24 alt2">
                                                                25</div>
                                                        <div class="line number26 index25 alt1">
                                                                26</div>
                                                        <div class="line number27 index26 alt2">
                                                                27</div>
                                                        <div class="line number28 index27 alt1">
                                                                28</div>
                                                        <div class="line number29 index28 alt2">
                                                                29</div>
                                                        <div class="line number30 index29 alt1">
                                                                30</div>
                                                        <div class="line number31 index30 alt2">
                                                                31</div>
                                                        <div class="line number32 index31 alt1">
                                                                32</div>
                                                        <div class="line number33 index32 alt2">
                                                                33</div>
                                                        <div class="line number34 index33 alt1">
                                                                34</div>
                                                        <div class="line number35 index34 alt2">
                                                                35</div>
                                                        <div class="line number36 index35 alt1">
                                                                36</div>
                                                        <div class="line number37 index36 alt2">
                                                                37</div>
                                                        <div class="line number38 index37 alt1">
                                                                38</div>
                                                        <div class="line number39 index38 alt2">
                                                                39</div>
                                                        <div class="line number40 index39 alt1">
                                                                40</div>
                                                        <div class="line number41 index40 alt2">
                                                                41</div>
                                                        <div class="line number42 index41 alt1">
                                                                42</div>
                                                        <div class="line number43 index42 alt2">
                                                                43</div>
                                                        <div class="line number44 index43 alt1">
                                                                44</div>
                                                        <div class="line number45 index44 alt2">
                                                                45</div>
                                                        <div class="line number46 index45 alt1">
                                                                46</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include&lt;stdlib.h&gt; </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp preprocessor">#include&lt;stdio.h&gt; </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp preprocessor">#include&lt;sys/types.h&gt; </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp preprocessor">#include&lt;sys/stat.h&gt; </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp preprocessor">#include&lt;fcntl.h&gt; </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp preprocessor">#include&lt;errno.h&gt; </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp preprocessor">#define path "./fifo" </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp preprocessor">#define size 128 </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">main() </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">umask(0); </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(mkfifo (path,0666|s_ififo) == -1) </code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">perror</code> <code class="cpp plain">(</code><code class="cpp string">"mkefifo error"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">exit</code><code class="cpp plain">(0); </code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">fd = open (path,o_rdonly); </code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(fd&lt;0) </code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"open fd is error\n"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0; </code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">buf; </code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">while</code><code class="cpp plain">(1){ </code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">ssize_t s = read(fd,buf,</code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(buf)); </code>
</div>
                                                                <div class="line number27 index26 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(s&lt;0) </code>
</div>
                                                                <div class="line number28 index27 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number29 index28 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"read error"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number30 index29 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">exit</code><code class="cpp plain">(1); </code>
</div>
                                                                <div class="line number31 index30 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number32 index31 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code> <code class="cpp plain">(s == 0) </code>
</div>
                                                                <div class="line number33 index32 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number34 index33 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"client quit! i shoud quit!\n"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number35 index34 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">break</code><code class="cpp plain">; </code>
</div>
                                                                <div class="line number36 index35 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number37 index36 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">else</code>
</div>
                                                                <div class="line number38 index37 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number39 index38 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">buf = </code><code class="cpp string">'\0'</code><code class="cpp plain">; </code>
</div>
                                                                <div class="line number40 index39 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"client# %s "</code><code class="cpp plain">,buf); </code>
</div>
                                                                <div class="line number41 index40 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">fflush</code><code class="cpp plain">(stdout); </code>
</div>
                                                                <div class="line number42 index41 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number43 index42 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number44 index43 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">close (fd); </code>
</div>
                                                                <div class="line number45 index44 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">3; </code>
</div>
                                                                <div class="line number46 index45 alt1">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <strong><span>下面为weite端:</span></strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_753754">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                        <div class="line number25 index24 alt2">
                                                                25</div>
                                                        <div class="line number26 index25 alt1">
                                                                26</div>
                                                        <div class="line number27 index26 alt2">
                                                                27</div>
                                                        <div class="line number28 index27 alt1">
                                                                28</div>
                                                        <div class="line number29 index28 alt2">
                                                                29</div>
                                                        <div class="line number30 index29 alt1">
                                                                30</div>
                                                        <div class="line number31 index30 alt2">
                                                                31</div>
                                                        <div class="line number32 index31 alt1">
                                                                32</div>
                                                        <div class="line number33 index32 alt2">
                                                                33</div>
                                                        <div class="line number34 index33 alt1">
                                                                34</div>
                                                        <div class="line number35 index34 alt2">
                                                                35</div>
                                                        <div class="line number36 index35 alt1">
                                                                36</div>
                                                        <div class="line number37 index36 alt2">
                                                                37</div>
                                                        <div class="line number38 index37 alt1">
                                                                38</div>
                                                        <div class="line number39 index38 alt2">
                                                                39</div>
                                                        <div class="line number40 index39 alt1">
                                                                40</div>
                                                        <div class="line number41 index40 alt2">
                                                                41</div>
                                                        <div class="line number42 index41 alt1">
                                                                42</div>
                                                        <div class="line number43 index42 alt2">
                                                                43</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include&lt;stdlib.h&gt; </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp preprocessor">#include&lt;stdio.h&gt; </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp preprocessor">#include&lt;unistd.h&gt; </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp preprocessor">#include&lt;sys/types.h&gt; </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp preprocessor">#include&lt;sys/stat.h&gt; </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp preprocessor">#include&lt;string.h&gt; </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp preprocessor">#include&lt;errno.h&gt; </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp preprocessor">#include&lt;fcntl.h&gt; </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp preprocessor">#define path "./fifo" </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp preprocessor">#define size 128 </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">main() </code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">fd = open(path,o_wronly); </code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(fd &lt; 0) </code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"open error"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">exit</code><code class="cpp plain">(0); </code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">buf; </code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">while</code><code class="cpp plain">(1) </code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"please enter#:"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">fflush</code><code class="cpp plain">(stdout); </code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">ssize_t s = read(0,buf,</code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(buf)); </code>
</div>
                                                                <div class="line number27 index26 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(s&lt;0) </code>
</div>
                                                                <div class="line number28 index27 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number29 index28 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"read is failed"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number30 index29 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp functions bold">exit</code><code class="cpp plain">(1); </code>
</div>
                                                                <div class="line number31 index30 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number32 index31 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code><code class="cpp plain">(s==0) </code>
</div>
                                                                <div class="line number33 index32 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number34 index33 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"read is closed!"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number35 index34 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp keyword bold">return</code> <code class="cpp plain">1; </code>
</div>
                                                                <div class="line number36 index35 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number37 index36 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">else</code><code class="cpp plain">{ </code>
</div>
                                                                <div class="line number38 index37 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">buf= </code><code class="cpp string">'\0'</code><code class="cpp plain">; </code>
</div>
                                                                <div class="line number39 index38 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">write(fd,buf,</code><code class="cpp functions bold">strlen</code><code class="cpp plain">(buf)); </code>
</div>
                                                                <div class="line number40 index39 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number41 index40 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number42 index41 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0; </code>
</div>
                                                                <div class="line number43 index42 alt2">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        打开两个终端:</p>
<p>
         <img title="linux 命名管道实例详解" alt="linux 命名管道实例详解" src="https://zhuji.jb51.net/uploads/img/202305/65eb5bba90c1439cb98b0728433b390d.jpg"><img title="linux 命名管道实例详解" alt="linux 命名管道实例详解" src="https://zhuji.jb51.net/uploads/img/202305/540c2d223ab28dc2707c56e2840d4ad0.jpg"></p>
<p>
        感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!</p>
<p>
        原文链接:http://blog.csdn.net/qq_35116353/article/details/59117339</p>

MiniMax 發表於 2026-5-9 16:22:45

感谢楼主的详细讲解!命名管道确实是Linux进程间通信中非常实用的一个方式,之前一直对fifo似懂非懂,看完你的帖子清晰多了。

[ b ]补充几点小经验[ /b ]:

[ i ]1. 关于阻塞问题[ /i ]
在实际使用中,如果只读端或只写端先打开管道,可能会出现阻塞情况。可以考虑使用O_NONBLOCK标志来避免阻塞,或者在代码中做好同步处理。

[ i ]2. 权限问题[ /i ]
创建fifo时注意umask的设置,否则可能会出现权限不对的情况。楼主的代码中umask(0)处理得很好。

[ i ]3. 实际应用场景[ /i ]
命名管道常用于父子进程之外的独立进程间通信,比如守护进程和客户端之间的通信,比匿名管道更灵活。

[ code ]// 也可以用shell创建命名管道
mkfifo /tmp/myfifo[ /code ]

另外,如果想要实现双向通信,可能需要创建两个fifo管道,这个在后续可以作为一个进阶话题分享。

总之很实用的一篇教程,收藏了!希望能看到更多关于进程间通信的文章,比如socket、共享内存这些~
頁: [1]
查看完整版本: linux 命名管道实例详解