linux无名管道

管道(无名管道):

管道和套接字一样不是属于进程的资源,而是属于操作系统的,因此也就不是fork的对象,fork只是复制了文件描述符。

 

管道的创建:

int pipe(int fd[2]);          //成功返回0,失败返回-1;

参数:指向意图存放文件描述符的int变量的指针(作参数时退化为指针,无法传递大小)

传参时,只需要传递一个元素类型为int大小为2的数组名即可,函数调用成功后数组中将存有两个文件描述符

pipefd[0]元素的描述符为管道读端, 只能用来读;pipe[1]元素的描述符为管道写端,只能用来写。


在使用管道时,应该将对自己来说没有的一端关闭close(),然后再使用自己需要的一端read()或write()

 

管道的特点:

1、管道通信是单向的,为半双工通信,因此数据只能由一个进程流向另一个进程,如果想要全双工通信,需要建立两个管道

2、写入的数据每次都添加到管道缓冲区的末尾,读数据的时候都是从缓冲区的头部读出数据。因此遵守先入先出的原则,即先写入的数据先读出。

3、管道的缓冲区大小是受限制的,且数据以无格式字节流的方式传输,需要输入方与输出方约定好数据格式

4、管道中的数据一旦被读取,将会从管道中消失。

5、管道只能用于父子进程或者兄弟进程间通信,即只能用于有亲缘关系的进程间通信

 

管道读写规则

当没有数据可读时

  • O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。
  • O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。

当管道满的时候

  • O_NONBLOCK disable: write调用阻塞,直到有进程读走数据
  • O_NONBLOCK enable:调用返回-1,errno值为EAGAIN

如果所有管道写端对应的文件描述符被关闭,则read返回0

如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE

当要写入的数据量不大于PIPE_BUF时,Linux将保证写入的原子性。

当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。

Detail 参见:

http://man7.org/linux/man-pages/man7/pipe.7.html

http://blog.csdn.net/nodeathphoenix/article/details/23284157

 

 

 

 

实现机制:

管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管道可以被循环利用。当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。当两个进程都终结的时候,管道也自动消失。


从原理上,管道利用fork机制建立,从而让两个进程可以连接到同一个PIPE上。最开始的时候,上面的两个箭头都连接在同一个进程Process1上(连接在Process 1上的两个箭头)。当fork复制进程的时候,会将这两个连接也复制到新的进程(Process2)。随后,每个进程关闭自己不需要的一个连接 (两个黑色的箭头被关闭;Process 1关闭从PIPE来的输入连接,Process 2关闭输出到PIPE的连接),这样,剩下的红色连接就构成了如上图的PIPE。


http://www.cnblogs.com/biyeymyhjob/archive/2012/11/03/2751593.html

 

Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为:

·      限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不象文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。

·      读取进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。

注意:从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。

http://www.cnblogs.com/davidwang456/p/3839874.html

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值