管道是 Linux 进程间通信的一种方式,如命令 ps -ef | grep ntp 。

  无名管道的特点包括:

  • 只能在亲缘关系进程间通信(父子或兄弟);
  • 半双工(固定的读端和固定的写端);
  • 它是特殊的文件,可以用 read、write 等,只能在内存中。

  管道函数原型:

 #include <unistd.h>int pipe(int fds[2]);

  我们知道,水管有两个端口,一端进水,另一端出水。管道就好比一条水管,也有两个端口,分别是读端和写端;进水可以看成数据从写端被写入,出水可以看成数据从读端被读出。可以分别用 read、write 函数来对管道的读端和写端进行读写,所以必须知道读、写两端分别对应的文件描述符。这两个文件描述符我们通常保存在一个有两个整形元素的数组中,如 int fds[2];然后调用函数 pipe(fd),这个函数会创建一个管道,并且数组 fds 中的两个元素会成为管道读端和写端对应的两个文件描述符:fds[0] 和 fds[1]。其中,fds[0] 和读端相对应,有可读属性;fds[1] 和写端相对应,有可写属性。

  函数 pipe 用于创建一个无名管道。如果成功,则 fds[0] 存放可读的文件描述符,fds[1] 存放可写文件描述符,并且函数返回 0;否则返回 -1。
  通过调用 pipe 函数获取这对打开的文件描述符后,一个进程可以从 fds[0] 中读取数据,而另一个进程可以往 fds[1] 中写数据。当然,只有两个进程间有继承关系,才能继承这对打开的文件描述符。
  模型如下所示:
  管道不像真正的物理文件,不是持久的,即两个进程终止后,管道也自动消失了。

  管道两端的关闭是有先后顺序的。如果先关闭写端,则从另一端读数据时,read 函数将返回 0,表示管道已经关闭。但是,如果先关闭读端,则从另一端写数据时,将会使写数据的进程接收到 SIGPIPE 信号。如果写进程不对该信号进行处理,将导致写进程终止;如果写进程处理了该信号,则写数据的 write 函数返回一个负值,表示管道已经关闭。

嵌入式Linux系统编程学习之二十无名管道(PIPE)相关推荐

  1. 嵌入式Linux系统编程学习之二十一命名管道(FIFO)

    文章目录 前言 一.创建.删除FIFO文件 1. 用函数创建和删除 FIFO 文件 2. 用命令创建和删除 FIFO 文件 二.打开.关闭FIFO文件 三.读写FIFO 前言   无名管道只能在有亲缘 ...

  2. 嵌入式Linux系统编程学习之二十八线程的等待退出

    文章目录 一.等待线程退出 二.线程的取消 三.线程终止清理函数 一.等待线程退出   线程从入口点函数自然返回,或者主动调用 pthread_exit 函数都可以让线程正常终止.线程从入口点函数自然 ...

  3. 嵌入式Linux系统编程学习之二十六多线程概述

    文章目录 一.多线程概述 二.线程分类 三.线程创建的Linux实现 一.多线程概述   进程是系统中程序执行和资源分配的基本单位.每个进程有自己的数据段.代码段和堆栈段,这就造成进程在进行切换等操作 ...

  4. 嵌入式Linux系统编程学习之二十九线程的互斥

    文章目录 前言 一.创建和销毁锁 二.互斥锁属性 三.锁操作 四.加锁注意事项 五.加锁步骤 前言   在 Posix Thread 中定义了一套专门用于线程互斥的 mutex 函数.mutex 是一 ...

  5. 嵌入式Linux系统编程学习之二十四消息队列

    文章目录 前言 一.msgget 函数 二.msgsnd 函数 三.msgctl 函数 补充 前言   消息队列与 FIFO 很相似,都是一个队列结构,都可以有多个进程往队列里面写信息,多个进程从队列 ...

  6. 嵌入式Linux系统编程学习之二十二内存映射

    文章目录 前言 一.mmap函数 二.munmap函数 三.补充 前言   内存映射函数包括 mmap.munmap 和 msync,其原型为: #include <unistd.h>#i ...

  7. 嵌入式Linux系统编程学习之二十五信号量

    文章目录 前言 一.System V IPC 机制:信号量 1. semget 函数 2. semop 函数 3. semctl 函数 二.Posix 有名信号量 前言   信号量与信号量集的概念如下 ...

  8. 嵌入式Linux系统编程学习之二常用命令

    嵌入式Linux系统编程学习之二常用命令 文章目录 嵌入式Linux系统编程学习之二常用命令 前言 一.常用命令 1.su(用户切换) 2.useradd(添加用户) 3.passwd(修改密码) 4 ...

  9. 嵌入式Linux系统编程学习之二十三 System V 共享内存机制

    文章目录 前言 一.ftok 函数 二.shmget 函数 三.shmat 函数 四.shmdt 函数 五.shmctl 函数 补充 前言   共享内存也是进程间(进程间不需要有继承关系)通信的一种常 ...

最新文章

  1. 操作系统 作业调度实验报告
  2. webpack打包第三方类库的正确姿势
  3. 我的ASP.NET AJAX控件——PopupNotificationExtender:实现OWA或Messenger样式的信息提示窗口...
  4. 如何处理SAP云平台错误消息 there is no compute unit quota for subaccount
  5. 将你的Vim 打造成轻巧强大的IDE
  6. 【Python CheckiO 题解】Count Consecutive Summers
  7. 安装php no permision,php安装过程中的No package ‘xxx’ found问题
  8. 面试官问你HashMap底层你用线程安全吊打他
  9. matlab 高级函数 —— colfilt/blockproc (图像)矩阵的分块处理
  10. 前景检测算法(十六)--背景减除结束篇
  11. 浅谈计算机网络技术应用及发展,【网络技术论文】计算机网络技术的应用及发展(共2891字)...
  12. VS通过opencv显示图片和打开相机的显示生成dll用unity调用
  13. TP LINK交换机 console 超级终端链接设置
  14. 第九届蓝桥杯b组java
  15. PHP laravel系列之迷你博客搭建
  16. PHP苹果内购验证步骤
  17. CASAIM自动化精密尺寸测量设备全尺寸检测铸件自动化检测铸件
  18. 机器学习算法面经(阿里京东拼多多百度等)
  19. 春节感悟 - 快递延误的售后问题
  20. send_nsca passive monitor setup notes

热门文章

  1. python安装与使用Ta-Lib,获取金融技术面特征
  2. php yii2 路径问题,yii2常用路径获取
  3. java届的黄埔军校_法学界的“黄埔军校”:拒绝与985合并,是其最大遗憾
  4. 利用oc门或od门实现线与_福师《数字逻辑》在线作业二答案
  5. carbon安装win7 thinkpad x1_联想thinkpad x1 carbon 2017笔记本使用u启动u盘安装win7系统教程...
  6. java数据结栈空的条件表达式_数据结构——栈和队列例题
  7. nginx 反向代理之 proxy_redirect
  8. C# ToString()和Convert.ToString()的区别【转】
  9. rxjs处理http请求超时
  10. 【bzoj1572】[Usaco2009 Open]工作安排Job 贪心+堆