unix系统编程 第十五章 15.2管道

管道是UNIX系统IPC的最古老形式,所有UNIX系统都提供此种通信机制。

管道有以下两种局限性:

  1. 历史上,它们是半双工的(即数据都只在一个方向上面流动)。现在某些系统提供全双工管道。
  2. 管道只能在具有公共祖先的两个进程之间使用,通常,一个管道由一个进程创建,在进程调用fork之后,这个管道就能在父进程和子进程之间使用了。

我们将会看到FIFO没有第二种局限性,UNIX域套接字没有这两种局限性。

管道是通过调用pipe函数创建的。

#include <unistd.h>
int pipe(int fd[2]);//返回值,成功返回0,出错返回-1

经由参数fd返回两个文件描述符:fd[0]为读而打开,fd[1]为写而打开。fd[1]的输出是fd[0]的输入。

单个进程的管道几乎没有任何用处,通常,进程会先调用pipe,接着调用fork,从而创建从父进程到子进程的IPC通道,反之亦然。

fork之后做什么取决于我们想要的数据流方向,对于从父进程到子进程的管道,父进程关闭管道的读端,子进程关闭写端。

当管道一端被关闭以后,下列两条规则起作用。

  1. 当读一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,表示文件结束。
  2. 如果写一个读端已被关闭的通道,则产生信号SIGPIPE.如果忽略该信号或者捕捉该信号并从其处理程序返回,则write返回-1,errno设置为EPIPE。

示例程序:

#include "apue.h"

int main()
{
  int n;
  int fd[2];
  pid_t pid;
  char line[MAXLINE];

  if(pipe(fd)<0)
          err_sys("pipe error");
  if((pid=fork())<0)
          err_sys("fork error");
  else if(pid>0)
  {
    close(fd[0]);
    write(fd[1],"hello world\n",12);
  }
  else
  {
    close(fd[1]);
    n=read(fd[0],line,MAXLINE);
    write(STDOUT_FILENO,line,n);
  }
  exit(0);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值