[15]APUE:pipe / FIFO
管道 pipe
一、概述
- 管道(pipe / FIFO)是一种文件,属于 pipefs 文件系统类型,可以使用 read、write、close 等系统调用进行操作
- 其本质是内核维护了一块缓冲区与管道相关联,对管道的任何操作,都将被内核转换成读写对应的内存缓冲区
- 只有当所有的写入端描述符均已关闭,且管道中的数据都被读出后,对读端描述符调用 read 才会返回 0 (EOF)
- 若所有读端已关闭,此时往管道的写操作会失败,调用进程会收到 SIGPIPE 信号,errno 被设置为 EPIPE
- 当所有的读端与写端均关闭后,管理才能被销毁
- 通常只保留一对一的读写端口,无用的端口需及时关闭
二、函数
[a] pipe
#include <unistd.h> int pipe(int pipefd[2]) //成功返回 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
转载于:https://www.cnblogs.com/hadex/p/6128446.html
[15]APUE:pipe / FIFO相关推荐
- Linux中的pipe(管道)与named pipe(FIFO 命名管道)
catalogue 1. pipe匿名管道 2. named pipe(FIFO)有名管道 1. pipe匿名管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入 ...
- linux pipe 命名管道,linux 进程学习笔记-named pipe (FIFO)命名管道
与"无名管道"不同的是,FIFO拥有一个名称来标志它,所谓的名称实际上就是一个路径,比如"/tmp/my_fifo",其对应到磁盘上的一个管道文件,如果我们用f ...
- linux进程通信:pipe实现进程同步
文章目录 通过管道同步进程 实现代码 管道缓冲区 设置缓冲区大小 总结 :pipe的特点 通过管道同步进程 管道自带同步互斥机制: 管道的内核实现:fs/pipe.c ,主要通过内核的锁以及等待队列等 ...
- .NET设计模式(15):结构型模式专题总结
.NET设计模式(15):结构型模式专题总结 --探索设计模式系列之十五 Terrylee,2006年5月 摘要:结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模 ...
- Windows Phone开发(15):资源
原文:Windows Phone开发(15):资源 活字印刷术是我国"四大发明"之一,毕昇在发明活字印刷术之后,他很快发现一个问题,随着要印刷资料的不断增加,要用到的汉字数目越来越 ...
- 【历史上的今天】7 月 15 日:Mozilla 基金会正式成立;Enigma 密码机的首次工作;任天堂推出 FC 游戏机
整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 7 月 15 日,在 2006 年的今天,Twttr(现在被称为 Twitter)正式推出:在 3 ...
- 竞赛练一练 第15期:电子学会2021年9月青少年软件编程(图形化)等级考试试卷(三级)...
青少年软件编程(图形化)等级考试试卷(三级) 分数:100.00 题数:38 需要访问更多题库,可以成为我们永久会员,享受在线题库训练 一.单选题(共25题,每题2分,共50分) ...
- 太空射击第15课: 道具
太空射击第15课: 道具(第1部分) 在本课中,我们将添加一些偶尔出现的道具. 本教程所需素材从这里可以下载 视频 您可以在此处观看本课程的视频 道具 我们的游戏已经走了很远,但我们仍然缺少的一件事是 ...
- 【历史上的今天】11 月 15 日:全球首款商用微处理器;微软进军游戏界;ICQ 诞生
整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 11 月 15 日,在 1982 年的今天,我国第一家婚姻介绍所成立:在 80 年代初," ...
最新文章
- python代码获取今天、昨天、明天的日期
- Java——BigInteger类和BigDecimal类
- 在html中怎么制作友情链接,如何制作一个网页链接,用描文本、友情链接交易方式教你如何制作?...
- war包部署-排除内嵌的tomcat
- 详解优酷视频质量评价体系
- Tyepcho超好看大前端模板
- Thrift java.net.SocketException: Broken pipe问题分析定位
- 大数据Hadoop生态系统介绍
- 自己设计完成的一个小区停车管理系统
- 控制工程基础学习笔记-第6章 控制系统的误差分析和计算
- lisp 天正标高_天正AutoCAD技巧看你知多少
- arcgis android 比例尺,ArcGIS for Android 自定义地图比例尺
- 安装nodejs遇到的坑
- 项目实训(十三)安装pun,pun的基础使用和概念
- Crushers is the determiner in mining industry
- 1024X600RGB屏幕规格书分析
- es 集群 number_of_shards、number_of_replicas
- arcgis enterprise三维发布失败问题记录及解决办法汇总(后续会继续更新)
- 【研究生】学会这几步,还怕不会写硕士论文?
- ILSSI|六西格玛DMAIC的历程