管道pipe

17 篇文章 0 订阅
6 篇文章 0 订阅
    管道是一种进程间的通信机制,Windows 和 Linux(以及 UNIX)上都使用的这种机制。  
    管道源自“贝尔实验室”开发的 UNIX ,并且所有的 UNIX 和 Linux 都继承了这项技术。  
    管道是通过通常的 IO 接口存取的字节流。创建管道后,通过使用操作系统的任何读或写 IO 系统调用来读或者写它。 
    在 UNIX 和 Linux 环境中,IO 调用是 read() 和 write()。  
    在 Windows 环境中,API 是 ReadFile() 和 WriteFile()。 
    Windows 管道与 Linux 管道的区别在于 Windows 使用单一句柄(类似于 Linux 文件描述符)支持双向 IO。 
    Linux 管道返回两个文件描述符来实现双向 IO。 

管道(pipe)通信

主要用于大批量的信息传递,管道可用于同一用户的同祖先的进程间通信,而有名管道(FIFO管道)可用于不同用户进程间的通信。 
系统将管道文件作为通信的介质,构成两端进程传递信息的流水线。通常设定一个进程向管道中写信息,另一个进程从管道中读信息。 

管道读写的特点:

(1)写操作
对管道写时,每次write调用操作的结果总是附加在管道的末端(而文件写可以通过调整指针随意进行); 
一次写入的字节数最好不要大于设定的系统常量PIPE_BUF;当设备处于忙状态时,write调用会被阻塞并被延迟执行。 
完成时将返回实际写入的字节数; 
当试图对一个没有被进程打开作为写的管道而进行write操作时,将生成SIGPIPE信号,并且系统公用变量errno的值被置为EPIPE,表示管道被破坏。
(2)读操作
所有的read调用总是从管道当前位置开始,即管道文件不支持搜索指针的移动; 
当管道中无信息时read系统调用被阻塞,但对空文件读时可返回空串并不发生阻塞; 
若管道未被其他进程以写方式打开,就对管道做read则返回0.

无名管道:

由系统调用pipe创建,当pipe调用成功时将返回两个整形文件描述符filedes[0]和filedes[1],分别指向两个数据流。
传统unix系统命令创建的管道是单向的(半双工方式)此时数据传递的方向是单向的,即所创建的文件描述符一端只能用于读, 
另一端只能用于写,若需要双方数据传递时则需要建立两个管道文件。 
而现代unix中pipe系统调用可以返回两个全双工的文件描述符,即所建立的管道可同时用于读操作和写操作。 
若filedes[0]用来写,则filedes[1]用来读,若filedes[1]用来写,则filedes[0]用来读,而半双工时时固定的。

有名管道:

本质上与无名管道在应用上是相同的,但有名管道具有一些其他的特点,如再有名管道生成时会在文件系统中生成一个目录表项, 
有了目录表项就有了文件访问权限的管理,就可以让其他进程对管道进行访问。 
有名管道可以在shell中创建也可以在程序中创建,创建有名管道的命令为:mknod
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值