pipe匿名管道

匿名管道由于没有名字, 因此只能由有亲缘关系的进程使用

#include <unistd.h>
int pipe(int fd[2]);
返回: 成功返回0, 出错返回-1该函数返回两个文件描述符: fd[0]和fd[1], 前者打开来读, 后者打开来写.

另一个关于管道的例子, 标准I/O函数库提供了popen函数, 它创建一个管道并启动另一个进程, 该进程要么从该管道读出标准输入, 要么往该管道写入标准输出

#include <stdio.h>FILE *popen(const char *command, const char *type);
返回: 成功返回文件指针,失败返回NULL
注意: popen不对标准错误输出做任何处理, 只有标准输出才被重定向到由它创建的管道int pclose(FILE *stream);
返回: 成功则为shell的终止状态, 失败为-1command是一个shell命令行, popen在调用进程和所指定的命令之间创建一个管道- 如果type为r, 调用进程读入command的标准输出
- 如果type为w, 调用进程写到command的标准输入

  • pipe01.c演示了父子进程间通过pipe实现半双工通信
  • pipe02.c演示了使用popen创建管道

FIFO 有名管道

每个FIFO有一个路径名与之关联, 从而允许无亲缘关系的进程访问同一个FIFO。

#include <sys/types.h>
#include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode);
返回: 成功返回0, 失败返回-1mkfifo函数已经隐含指定了O_CREAT | O_EXCL, 也就是说, 它要么创建一个新的FIFO, 要么返回一个EEXIST错误(如果所指定名字的FIFO已经存在)。此处可参考示例中的正确创建FIFO的步骤- 创建出一个FIFO后, 它必须或者打开来读, 或者打开来写。不能打开来既读又写, 因为它是**半双工**的
- 如果一个FIFO, 当前尚没有进程打开它来写, 那么此时打开该FIFO来读的进程将会阻塞
- 对管道或FIFO的write总是往末尾添加数据, 对它们的read总是从开头返回数据。
- 如果对管道或FIFO执行lseek, 会返回ESPIPE错误
- 当对一个管道或FIFO的最终close发生时, 该管道或FIFO中的任何残留数据都被丢弃

  • fifo_read.c 中从文件data.txt中读取内容, 写入到FIFO中
  • fifo_write.c 中从FIFO中读取内容, 写入到datafromfifo.txt中
  • data.txt 是测试文件
  • datafromfifo.txt 是fifo_write.c运行后生成的文件

管道和FIFO的区别

  • 创建并打开一个管道, 只需要调用pipe;创建并打开一个FIFO则需在调用mkdifo后再调用open
  • 管道在所有进程最终都关闭它之后自动消失。FIFO的名字则只有通过调用unlink才从文件系统中删除
  • FIFO需要额外调用的好处: FIFO在文件系统中有一个名字, 该名字允许某个进程创建一个FIFO, 与它无亲缘关系的另一个进程来打开这个FIFO, 这对管道来说是不可能的(不考虑传递描述符的情况)

管道和FIFO的限制

系统加于管道和FIFO的唯一限制为:

  • OPEN_MAX 一个进程在任意时刻打开的最大描述符数
  • PIPE_BUF 可原子地写往一个管道或FIFO的最大数据量
  • get_sys_conf.c 获取当前系统的OPEN_MAX和PIPE_BUF值

将一个描述符设为非阻塞两种方式

  1. 调用open的时候可指定O_NONBLOCK标志
  2. 如果一个描述符已打开, 那么可以调用fcntl以启用O_NONBLOCK标志。 对于管道来说, 必须使用这种技术, 因为管道没有open调用, 在pipe中也无法指定O_NONBLOCK标志

FIFO的真正优势表现在服务器可以是一个长期运行的进程(例如守护进程), 而且与其客户可以无亲缘关系。 作为服务器的守护进程以某个众所周知的路径名创建一个FIFO, 并打开该FIFO来读。此后某个 时刻启动的客户打开该FIFO来写, 并将其命令或给守护进程的其他任何东西通过该FIFO发送出去。 使用FIFO很容易实现这种形式的单向通信(client->server)。如果守护进程需要向客户发送 回一些东西, 那就需要点技巧(例如客户需要通知守护进程要打开哪个FIFO可以给其发消息)

文中代码托管在: https://github.com/carl-wang-cn/demo/tree/master/ipc

欢迎关注我的公众号: carl的修行

匿名管道 阻塞_进程间通信-管道相关推荐

  1. linux程序间管道通信,linux进程间通信——管道 详解

    管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入.常说的管道多是指无名管道, 无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别. 有名管道叫nam ...

  2. 淤泥管道机器人_淤泥管道机器人

    淤泥管道机器人 产品介绍 X5-HR淤泥管道机器人由螺旋式推进爬行器.电缆盘和显控终端三部分组成,适用于DN600mm以上淤积及较高水位等常规CCTV检测机器人无法检测的环境,可用于市政排水管道.箱涵 ...

  3. #Linux#进程间通信# 管道(pipe)-匿名管道pipe

    我们通常把一个进程连接到另一个进程的一个数据流称为一个"管道",通常是用作把一个进程的输出通过管道连接到另一个进程的输入.管道本质上是内核的一块缓存.内核使用环形队列机制,借助内核 ...

  4. 【Linux】进程间通信--管道(匿名管道和命名管道)

    文章目录 前言 进程间通信的目的 管道 匿名管道 管道特点 站在文件描述符角度理解管道 匿名管道通信读写特点 命名管道 命名管道的原理 命名管道的创建 命名管道完成两个不同进程通信 匿名管道和命名管道 ...

  5. python popen阻塞_对Python subprocess.Popen子进程管道阻塞详解

    问题产生描述 使用子进程处理一个大的日志文件,并对文件进行分析查询,需要等待子进程执行的输出结果,进行下一步处理. 出问题的代码 # 启用子进程执行外部shell命令 def __subprocess ...

  6. 使用系统调用pipe建立一条管道线_【Linux系统】Linux进程间通信

    作者:Vamei 出处:http://www.cnblogs.com/vamei 我们在Linux信号基础中已经说明,信号可以看作一种粗糙的进程间通信(IPC, interprocess commun ...

  7. 操作系统实验报告9:进程间通信—管道和 socket 通信

    操作系统实验报告9 实验内容 实验内容:进程间通信-管道和 socket 通信. 编译运行课件 Lecture11 例程代码: alg.11-3-socket-input-2.c alg.11-4-s ...

  8. 【Linux系统编程学习】匿名管道pipe与有名管道fifo

    此为牛客Linux C++和黑马Linux系统编程课程笔记. 0. 关于进程通信 Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间.任何一个进程的全局变量在另一个进程中都看不到 ...

  9. linux下的进程间通信-管道及共享内存

    进程间通信(IPC):操作系统为用户提供的集中进程间通信方式: 为什么要进程间通信? 进程之间具有独立性(每个进程有自己的虚拟地址空间),访问自己的虚拟地址,无法访问同一块区域,因此无法实现数据通信. ...

最新文章

  1. 替换空格---StringBuilder
  2. Arduino(新手之路2)
  3. serialVersionUID的作用(转)
  4. UTXO 与账户余额模型
  5. 很朴素的学习嵌入式系统的经验
  6. plsql查询数据中文乱码
  7. 负边距在布局中的使用
  8. OpenCV-绘制奥运五环(带套接效果)
  9. maven 生命周期的指令
  10. 解读IBM存储虚拟化的两大法宝
  11. 【转•科普】为什么Nikola Tesla是迄今为止最伟大的极客(爱迪生啊爱迪生)
  12. shell脚本大全(一)
  13. 大伽「趣」说AI:在多个场景中的AI落地实践
  14. 【头发渲染】Technical Artist的不归路 —— Kajiya-Kay Shading
  15. 钢铁侠是如何练成的(一)
  16. Win10系统上搭建GIT本地服务器
  17. Z39.50客户端源代码(C#)
  18. 2022高频面试题之css篇
  19. 问题 E: 来淄博旅游
  20. 国开电大 创业教育 形考任务作业1-4

热门文章

  1. sql创建表主键gui_在SQL Server中使用主数据服务快速创建最终用户可以维护的GUI
  2. 解决子元素浮动,父元素没有撑开的问题
  3. MFC DLL 导出函数的定义方式
  4. 读取配置文件(configparser,.ini文件)
  5. Backup--查看备份还原需要的空间
  6. 如何最快的销售砖头(2.0版)
  7. GitHub的SSH免密连接
  8. Cookies 、 Session 和 token 的区别
  9. react native进一步学习(NavigatorIOS 学习)
  10. 常用的关系型数据库的优劣与选择