pipe函数详解

pipe函数详解pipe 函数可用于创建一个管道 以实现进程间的通信 pipe 函数的定义如下 pipe 函数定义中的 fd 参数是一个大小为 2 的一个数组类型的指针 该函数成功时返回 0 并将一对打开的文件描述符值填入 fd 参数指向的数组 失败时返回 1 并设置 errno 通过 pipe 函数创建的这两个文件描述符 fd 0 和 fd 1 分别构成管道的两端 往 fd 1 写入的数据可以从 fd 0 读出 并且 fd 1 一端只能进行写操作 fd 0 一端只能进行读操作 不能反过来使用 要实

pipe函数可用于创建一个管道,以实现进程间的通信。

pipe函数的定义如下:

#include 
  
    int pipe(int fd[2]); 
  

        pipe函数定义中的fd参数是一个大小为2的一个数组类型的指针。该函数成功时返回0,并将一对打开的文件描述符值填入fd参数指向的数组。失败时返回 -1并设置errno。

        通过pipe函数创建的这两个文件描述符 fd[0] 和 fd[1] 分别构成管道的两端,往 fd[1] 写入的数据可以从 fd[0] 读出。并且 fd[1] 一端只能进行写操作,fd[0] 一端只能进行读操作,不能反过来使用。要实现双向数据传输,可以使用两个管道。

        默认情况下,这一对文件描述符都是阻塞的。此时,如果我们用read系统调用来读取一个空的管道,则read将被阻塞,直到管道内有数据可读;如果我们用write系统调用往一个写满的管道中写数据,则write也将被阻塞,直到管道有足够的空闲空间可用(read读取数据后管道中将清除读走的数据)。当然,用户可自行将 fd[0] 和 fd[1] 设置为非阻塞的。

        如果管道的写端文件描述符 fd[1] 的引用计数减少至0,即没有任何进程需要往管道中写入数据,则对该管道的读端文件描述符 fd[0] 的read操作将返回0(管道内不存在数据的情况),即读到了文件结束标记(EOF,End Of File);反之,如果管道的读端文件描述符 fd[0] 的引用计数减少至0,即没有任何进程需要从管道读取数据,则针对该管道的写端文件描述符 fd[1] 的write操作将失败,并引发SIGPIPE信号(往读端被关闭的管道或socket连接中写数据)。

        管道内部传输的数据是字节流,这和TCP字节流的概念相同。但它们又存在细微的差别。应用层程序能往一个TCP连接中写入多少字节的数据,取决于对方接受窗口的大小和本端的拥塞窗口的大小。而管道的话本身拥有一个容量限制,它规定如果管道的写端应用程序不将管道中数据读走的话,该管道最多还能被写入多少字节的数据。管道容量的大小默认是65536字节。我们也可以使用fcntl函数来修改管道容量。

        此外,socket 的基础 API 中有一个socketpair 函数。它能够方便地创建双向管道。其函数定义如下:

#include 
  
    #include 
   
     int socketpair(int domain, int type, int protocol, int fd[2]); 
    
  

        socketpair 前三个参数的含义和 socket 系统调用的三个参数完全相同,但domain只能使用 UNIX本地域协议族AF_UNIX,因为对于双向管道我们只能在本地使用。最后一个参数和 pipe系统调用的参数一样,只不过 socket系统调用创建的这一对文件描述符即使可读的也是可写的。

        socketpair函数执行成功返回0,失败返回 -1并设置errno。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204251.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午8:39
下一篇 2026年3月19日 下午8:40


相关推荐

  • 新硬盘怎么初始化?新硬盘上机初始化的3种方法

    新硬盘怎么初始化?新硬盘上机初始化的3种方法

    2026年3月16日
    3
  • 开源四足机器人 附设计图及代码「建议收藏」

    斯坦福学生机器人俱乐部(StanfordStudentRoboticsclub)ExtremeMobility团队最近迎来了一名新成员——一个名为StanfordDoggo的四足机器人。这个机器人能跳1米多高,还能表演后空翻。与其他四足机器人动辄上万美元的成本不同,这个机器人的成本降到了3000美元以下,而且设计团队开源了该机器人的设计图、代码以及材料清单。任何感兴趣的人…

    2022年4月6日
    63
  • Java 枚举(enum) 详解五种常见的用法

    Java 枚举(enum) 详解五种常见的用法nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp Java 枚举 enum 详解五种常见的用法一 枚举型常量 packagecom yang 首先枚举是一个特殊的 class 这个 class 相当于 finalstatic 修饰 不能被继承 他的构造方法强制被私有化 下面有一个默认的构造方法

    2026年3月17日
    2
  • 卡盟主站安装教程

    卡盟主站安装教程config.php数据库连接文件配置 视频密码confighttp://www.tudou.com/v/adVnUX3dMOM/&rpid=61582914&resourceId=61582914_04_05_99/v.swf卡盟主站搭建源码上传 视频密码kamengyuanmahttp://www.tudou.com/v/yv0tpzikiC8/&rp…

    2022年8月12日
    8
  • 树莓派简单教程(一)「建议收藏」

    树莓派简单教程(一)「建议收藏」一、什么是树莓派基于ARM的微型电脑主板,其系统基于linux二、树莓派能做什么2.1挖矿【树莓派:居然拿我干这事?———6分钟使用树莓派,编译CPU挖矿程序测试算力。-哔哩哔哩】https://b23.tv/tvx06lM…

    2022年10月14日
    4
  • TFRecord和tf.Example

    TFRecord和tf.Example写 tfrecord 文件 importtensor examples tutorials mnistimporti datadefint64 feature value returntf train Feature int64 list tf train Int64List value value defbytes feature value returntf

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号