当前位置:   article > 正文

c 管道操作_c pipe()

c pipe()

管道

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

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

$ cat file | grep "pipe" | more
  • 1

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

创建管道

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

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

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

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

管道有以下一些特点:

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

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

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

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

父子进程间的管道通信

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号