管道(匿名管道与有名管道及两者区别)

无名管道(匿名管道)pipe:

        1、它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端

        2、只能用于具有亲缘关系的进程间通信(父子进程、兄弟进程等)

        3、可以看成是一种特殊的文件,对它的读写也可以使用普通的read、write等函数,但它不是普通的文件,不属于任何文件系统,并且只能存在于内存中。

无名管道的一些特性:

读管道:
        管道中有数据,read返回实际读到的字节数。
        管道中无数据:
            写端被全部关闭,read返回0(相当于读到文件的末尾)
            写端没有完全关闭,read阻塞等待

    写管道:
        管道读端全部被关闭,进程异常终止(进程收到SIGPIPE信号)
        管道读端没有全部关闭:
            管道已满,write阻塞
            管道没有满,write将数据写入,并返回实际写入的字节数

有名管道FIFO:

        1、有名管道(FIFO) 不同于匿名管道之处在于它提供了一个路径名与之关联,以FIFO
的文件形式存在于文件系统中,并且其打开方式与打开一个普通文件是一样的,这样
即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此
通过FIFO相互通信,因此,通过FIFO不相关的进程也能交换数据。
        2、一旦打开了FIFO, 就能在它.上面使用与操作匿名管道和其他文件的系统调用一样的i/o系统调用了(如read()、 write()和close()) 。与管道一样,FIFO也有一个写入端和读取端,并且从管道中读取数据的顺序与写入的顺序是一样的。

有名管道(FIFO)和匿名管道(pipe) 有一些特点是相同的,不一样的地方在于:
1. FIFO 在文件系统中作为一个特殊文件存在,但FIFO 中的内容却存放在内存中。
2.当使用FIFO的进程退出后,FIFO文件将继续保存在文件系统中以便以后使用。
3.FIFO有名字,不相关的进程可以通过打开有名管道进行通信。

通过命令创建有名管道:
        mkfifo        名字

    有名管道的注意事项

        1.一个为只读而打开一个管道的进程会阻塞,直到另外一个进程为只写打开管道

        2.一个为只写而打开一个管道的进程会阻塞,直到另外一个进程为只读打开管道

    读管道:

        管道中有数据,read返回实际读到的字节数

        管道中无数据:

            管道写端被全部关闭,read返回0,(相当于读到文件末尾)

            写端没有全部被关闭,read阻塞等待

    写管道:

        管道读端被全部关闭,进行异常终止(收到一个SIGPIPE信号)

        管道读端没有全部关闭:

            管道已经满了,write会阻塞

            管道没有满,write将数据写入,并返回实际写入的字节数。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值