管道 pipe

一、概述

  • 管道(pipe / FIFO)是一种文件,属于 pipefs 文件系统类型,可以使用 read、write、close 等系统调用进行操作
  • 其本质是内核维护了一块缓冲区与管道相关联,对管道的任何操作,都将被内核转换成读写对应的内存缓冲区
  • 只有当所有的写入端描述符均已关闭,且管道中的数据都被读出后,对读端描述符调用 read 才会返回 0 (EOF)
  • 若所有读端已关闭,此时往管道的写操作会失败,调用进程会收到 SIGPIPE 信号,errno 被设置为 EPIPE
  • 当所有的读端与写端均关闭后,管理才能被销毁
  • 通常只保留一对一的读写端口,无用的端口需及时关闭

二、函数

[a] pipe

#include <unistd.h>
int pipe(int pipefd[]) //成功返回 0,出错返回 -1 
  • 将整型数组 pipefd 的两个元素初始化为一对文件描述符,分别用于从管道中读数据(pipefd[0])、写数据(pipefd[1])
  • 由于 fork 之后子进程继承父进程的文件描述符,pipe 通常用于父子进程通信
  • 同一会话中的进程可通过复制(dup2)文件描述符的方式实现管道通信,如 shell 的 ‘|’ 功能

[b] popen / pclose

#include <stdio.h>
FILE *popen(const char *cmd, const char *type) //成功返回 FILE 流指针,出错返回 NULL
int pclose(FILE *stream) //成功返回 0,出错返回 -1 
  • popen 用于通过 shell 执行外部程序 cmd

    • 当 type 设置为 “r” 时,通过 fgets、fgetc 等函数可获取 cmd 执行结果(标准输出)
    • 当 type 为 “w” 时,写通过 fputs 等函数为 cmd 标准输入
  • 与 system 函数原理类似,但 system 在返回之前,调用程序将一直阻塞;而 popen 不同,在调用 popen 之后到 pclose 返回之前这段时间,调用进程与被执行的 shell 子进程是并行的,若在此期间,调用程序又 fork 了子进程且安装了 SIGCHLD 信号的处理函数,可能导致 shell 子进程返回的 SIGCHLD 信号被捕获,从而使 pclose 无法等待 cmd 进程的退出而失败

命名管道 FIFO

一、概要

  • FIFO 是在 fifo 核心代码之上构建的外壳,通过文件系统中的文件直接引用,可用于同一操作系统内任意两个进程的通信
  • FIFO 通过设置不同的 open 权限标志位区分输入输出端,读端通常设置 O_RDONLY,写端通常设置 O_WRONLY
  • 管道传输的内容通常为非结构化的字节流,当多个客户端同时连接服务端 FIFO 时,为准确区分不同客体的内容,通常客户端发送的字节流前 N 个字节固定用于指定当次传输的数据长度

二、函数

[a] mkfifo

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *path, mode_t mode) //成功返回 0,出错返回 -1 
  • fcntl 函数设置的 O_NONBLOCK 标志位会对 FIFO 的行为产行影响

    • 当写端未就緒时,读操作将也会立即以成功状态返回,errno 设置为 EAGAIN
    • 当读端未就緒时,写操作将立即以出错状态返回,并设置 errno 为 ENXIO
  • 识别 FIFO 文件类型:用 stat 或 fstat 函数将文件属性写入 buf 结构体,S_ISFIFO(buf->st_mode) 的返回真(1)即为 FIFO

[15]APUE:pipe / FIFO的更多相关文章

  1. 进程间通信和同步:pipe、FIFO、消息队列、信号量、共享内存、信号

    一.半双工管道(pipe) 关于管道详细介绍可参考http://www.cnblogs.com/nufangrensheng/p/3560130.html. 1.管道实现父子进程间通信实例: /* p ...

  2. Linux中的pipe(管道)与named pipe(FIFO 命名管道)

    catalogue . pipe匿名管道 . named pipe(FIFO)有名管道 1. pipe匿名管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常 ...

  3. [04]APUE:文件与目录

    [a] stat / lstat / fstat #include <sys/stat.h> int stat(const char *restrict pathname, struct ...

  4. Windows Phone 8初学者开发—第15部分:在选中ListItem时播放声音

    原文 Windows Phone 8初学者开发—第15部分:在选中ListItem时播放声音 第15部分:在选中ListItem时播放声音 原文地址:  http://channel9.msdn.co ...

  5. Windows Phone开发(15):资源

    原文:Windows Phone开发(15):资源 活字印刷术是我国"四大发明"之一,毕昇在发明活字印刷术之后,他很快发现一个问题,随着要印刷资料的不断增加,要用到的汉字数目越来越 ...

  6. JVM基础系列第15讲:JDK性能监控命令

    查看虚拟机进程:jps 命令 jps 命令可以列出所有的 Java 进程.如果 jps 不加任何参数,可以列出 Java 程序的进程 ID 以及 Main 函数短名称,如下所示. $ jps 6540 ...

  7. Qt 学习之路 2(15):标准对话框 QMessageBox

    Qt 学习之路 2(15):标准对话框 QMessageBox  豆子  2012年9月18日  Qt 学习之路 2  40条评论 所谓标准对话框,是 Qt 内置的一系列对话框,用于简化开发.事实上, ...

  8. Android零基础入门第15节:掌握Android Studio项目结构,扬帆起航

    原文:Android零基础入门第15节:掌握Android Studio项目结构,扬帆起航 经过前面的学习,Android Studio开发环境已准备OK,运行Android应用程序的原生模拟器和Ge ...

  9. [13]APUE:KQUEUE / FreeBSD

    [a] 概述 kqueue API 由两个函数(kqueue.kevent).一个辅助宏(EV_SET).一个结构体(struct kevent)构成,可以应用于 socket.FIFO.pipe.a ...

随机推荐

  1. 我个人结合到老师的来理解的——Asp.net Webform的页面生命周期

    1.分析请求的资源路径,寻找目录中对应的资源文件,若无法找到资源文件,则返回404错误2.分析资源文件的Page命令,通过Page指令找到代码文件和类 3.将页面文件和类一起编译生成最终的类(仅仅在第 ...

  2. SharePoint Style Library的权限问题

    Style Library是属于site collection级别的. 所以如果在某一个site中直接给某个用户设置了比如Full control的权限,这个权限信息并不会自动进入Style Libr ...

  3. Git相关文章

    1.Git教程 2.Git常用命令整理 3.EGit(Git Eclipse Plugin)使用

  4. TCP协议疑难杂症全景解析

    说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...

  5. http协议get、post请求分析及用HttpRequester测试的报错及可能原因

    1.get.post区别 Get Post 获取/提交数据 主要获取数据,不修改数据 主要提交数据,可修改数据 是否需要form表单 不一定 需要 安全性 查询字符串会显示在地址栏的URL中,不安全. ...

  6. 删除ubuntu后无法进入windows

    一天,脑袋一热想装个ubuntu学习学习,结果装的ubuntu版本比较老,没有集成我笔记本的网卡驱动,在ubuntu下上不了网,心想上不了网学习起来不是很不方便,于是就直接在win7下将ubuntu的 ...

  7. python-day-20

    重点总结记录 1.Django请求的生命周期 路由系统 -> 试图函数(获取模板+数据=>渲染) -> 字符串返回给用户 2.路由系统 /index/ -> 函数或类.as_v ...

  8. copy(python中的引用,浅拷贝,深拷贝)

    #直接赋值 list = [1,2,['a','b'],'python'] #现将a等于list a = list print a [1,2,['a','b'],'python'] list.appe ...

  9. java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bind

    1. 启动注册表编辑器. HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters 2. 新建 值名称:MaxUser ...

  10. lucene和ElasticSearch基本概念

    lucene基本概念 索引(Index) 对应一个倒排表,一个检索的基本单位.在lucene中就对应一个目录. lucene基本概念 段(Segment) 一个索引可以包含多个段,段与段之间是独立的, ...