发信人: tcpip (俺的昵称改了), 信区: cnunix
标  题: 本地进程间通信第二讲:无名管道(一)
发信站: 哈工大紫丁香 (Sun Sep 26 15:31:21 1999), 转信

发信人: cpu (奔腾的心), 信区: Solaris
发信站: 华南网木棉站 (Fri Aug 21 21:31:26 1998), 转信

无名管道或者叫低级管道,是提供给父子进程间通信的一个手段。下面详细讲
述有关调用。

1.创建低级管道

     #include <unistd.h>
     int pipe(int filde[2]);

pipe调用创建一个可读写的先入先出管道,并生成两个与管道有关的文件描述
符,filed[0]专门负责读该管道,filed[1]专门负责写该管道,对管道的读写
可利用read和write调用。pipe调用成功返回0,否则返回-1,errno置相应的
出错码。

                             pipe
             filed[0] <-=================<- filed[1]

该管道若只用于创建pipe的进程内也是可以的,该进程写filed[1],然后就
可从filed[0]把刚才写filed[1]的东东又读了出来呵呵,自娱自乐;)  但是也
就失去了进程间通信的意义了;(

通常该调用和fork一起用,由于fork会向子进程传递所有打开的文件描述符,
所以调用进程pipe成功再fork一把,pipe与父子进程的关系就成了下面这个样
子:
             filed[0] <-     pipe        <- filed[1] (father)
                         》===========《
             filed[0] <-                 <- filed[1] (son)

即管道只有一个,但是父子进程中共有四个描述符可以存取该管道!酱紫不好
玩呵呵比如father写它的filed[1]结果father和son的filed[0]都可以读,抢着
读会伤了父子感情呵呵。解决办法是各自关一个描述符,比如老子关了写的,
儿子关了读的,en...不错,儿子写给老子看天经地义:

    (father) filed[0] <-     pipe 
                         》===========《
                                         <- filed[1] (son)

以上过程可以由以下代码描述:

        int     pid;    
        int     filed[2];
        ...

        if (pipe(filed) < 0) {
                perror("pipe");
                exit(-1);
        }

        if ((pid = fork( )) < 0) {
                perror("fork");
                exit(-1);
        } else if (pid > 0) {   /* father */
                close(filed[1];
                read(filed[0], ...);
                ...
        } else {                /* son */
                close(filed[0]);
                write(filed[1], ...);
                ...
        }
--

        ******************************************************
                
               青岛啤酒,可能是世界上最好的啤酒 。。。 。。。

        ******************************************************

※ 修改:.trueip 于 Sep 26 15:35:08 修改本文.[FROM: dns.mtlab.hit.ed]
--
※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: dns.mtlab.hit.ed]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: trueip.bbs@melon.gzn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.017毫秒