c 管道操作

管道

管道是UNIX中最古老的进程间通信机制,它提供进程之间单向通信的方法。简单地说,管道是连接一个进程的输出至另一个进程的输入的一种方法。

管道的使用很广泛,最常见的是在命令行中,例如,在下面的命令中就使用了管道:

$ cat file | grep "pipe" | more

这里,在cat、grep和more三个命令之间使用了两个管道,UNIX shell用这两个管道连接命令cat、grep和more,分别使得cat的标准输出成为grep的标准输入,grep的标准输出成为more的标准输入。

创建管道

创建管道需调用pipe()函数。从管道的物理形状可推知,它应当有一个输入端和一个输出端。确实如此,pipe()的唯一参数是一个由两个整数组成的数组,该数组在pipe()调用成功后将含有作为管道使用的两个文件描述字,其中一个作为管道的输入,另一个作为管道的输出。

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

当进程调用pipe()成功时,内核在系统内部将创建一条管道,并设置由该管道使用的两个已打开文件描述字于数组fdes。其中fdes[0]设置为读而打开,是与输入端相连的文件描述字。fdes[1]设置为写而打开,是与输出端相连的文件描述字。一种较易记住谁是输入输出端描述字的方法是:由文件描述字0是标准输入,文件描述字1是标准输出,推出fdes[0]是输入端,fdes[1]是输出端。

pipe()调用成功返回0,否则返回-1并置errno错误条件。

管道有以下一些特点:

管道没有名字,因此也叫匿名管道,它是为了一次使用而创建的。

管道的两个描述字是同时打开的。如果从一个没有任何进程向它写的管道读数据(由于这些进程已关闭了所有文件或已退出),read将返回文件结束。如果往一个没有进程读它的管道中写数据,则视为错误;这将导致生成SIGPIPE信号,并且当信号被阻塞时将以EPIPE错误失败。

管道不允许文件定位,读和写操作都是顺序的,读从文件的开始处读,写则写至文件尾。

管道的用途在于父、子进程之间的通信。当我们需要在这样的两个进程之间传递数据时,管道的优势便体现出来了。

父子进程间的管道通信

在第6章我们已经知道,当进程调用fork()派生一个子进程时,子进程将继承父进程所有打开的文件描述字。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值