5.4 管道

5.4 管道
管道是一种允许单向通信的设备。数据写入管道的“写端”,从“读端”读出。管道是串行设备,数据的读出顺序和写入顺序相同。
典型的,管道用在一个进程的两个线程之间或者用在父子进程之间。
    在 shell 中, 符号 "|" 创建一个管道。例如,
    % ls | less
    这将会产生两个进程。一个 ls 一个 less。shell还会创建一个管道用于连接ls子进程的标准输出和less子进程的标准输入。ls
    列举出的文件名如同直接输出到终端一样的顺序输出到less。
管道的容量是有限的。如果管道不能够再存储更多的数据时,写管道进程将阻塞,直到有空间可写。对于读进程也是类似的。因此,管道
自动协调了两个进程。

5.4.1 创建管道
使用 pipe() 创建管道。你要提供一个大小为2的整型数组。pipe()调用将会把读端的文件描述符存入数组的0索引处。把写端文件描述符
写入数组的1索引处。如下,


5.4.2 父子进程间通信
pipe()调用创建的文件描述符只在同一个进程内部或者父子进程之间有效。一个进程的文件描述符不能在不相关的进程间传递。一个进程
调用 fork时,它的文件描述符会被复制到子进程空间。因此,管道只能连接相关进程。
    在下面的例子中,父进程把一个字符串写入管道,子进程从管道中读出。在例子中,使用fdopen()把文件描述符转化为 FILE* 流
之所以使用流(stream)而不是文件描述符,是因为这样我们就可以使用高级的标准C库,比如 printf 和 fgets。
 
5.4.3 标准输入、输出、错误流重定向
你可能经常想创建一个子进程,把管道的一端作为子进程的标准输入或者标准输出。使用 dup2()你可以把两个文
件描述符等同成为一个。例如,把一个进程的标准输入重定向为文件描述符 fd,使用如下的操作,
    dup2 (fd, STDIN_FILENO);
 STDIN_FILENO代表标准输入的文件描述符,它的值为0.这个调用关闭了标准输入然后重新作为fd复制打开,这样两者就可以相互替代的使用。相等的文件描述符共享相同的文件指针的位置,和相同的文件状态集。因此,从fd
 读出的字符串跟从标准输入中读出的相同。
    下面的例子,

5.4.4 popen 和 pclose
通常管道被用来向一个子程序发送数据或则从一个子进程读入数据。 popen 和 pclose 使该过程很容易。因为,它使我们避免使用 pipe,fork,dup2,exec 和 fdopen.

popen()创建了一个子进程,执行sort 命令,代替了使用 pipe,fork,dup2,execlp.
第二个参数,"w",指示该进程想要向子进程写数据。 popen的返回值为管道的一端,这一端与子进程的标准输入
相连。写操作完成后,pclose 关闭子进程的流,等待子进程结束,返回它的状态码。如果第二个参数为 "r",
类似的返回的管道的一端与子进程的标准输出相连。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值