嵌入式Linux系统编程学习之二十无名管道(PIPE)
管道是 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)相关推荐
- 嵌入式Linux系统编程学习之二十一命名管道(FIFO)
文章目录 前言 一.创建.删除FIFO文件 1. 用函数创建和删除 FIFO 文件 2. 用命令创建和删除 FIFO 文件 二.打开.关闭FIFO文件 三.读写FIFO 前言 无名管道只能在有亲缘 ...
- 嵌入式Linux系统编程学习之二十八线程的等待退出
文章目录 一.等待线程退出 二.线程的取消 三.线程终止清理函数 一.等待线程退出 线程从入口点函数自然返回,或者主动调用 pthread_exit 函数都可以让线程正常终止.线程从入口点函数自然 ...
- 嵌入式Linux系统编程学习之二十六多线程概述
文章目录 一.多线程概述 二.线程分类 三.线程创建的Linux实现 一.多线程概述 进程是系统中程序执行和资源分配的基本单位.每个进程有自己的数据段.代码段和堆栈段,这就造成进程在进行切换等操作 ...
- 嵌入式Linux系统编程学习之二十九线程的互斥
文章目录 前言 一.创建和销毁锁 二.互斥锁属性 三.锁操作 四.加锁注意事项 五.加锁步骤 前言 在 Posix Thread 中定义了一套专门用于线程互斥的 mutex 函数.mutex 是一 ...
- 嵌入式Linux系统编程学习之二十四消息队列
文章目录 前言 一.msgget 函数 二.msgsnd 函数 三.msgctl 函数 补充 前言 消息队列与 FIFO 很相似,都是一个队列结构,都可以有多个进程往队列里面写信息,多个进程从队列 ...
- 嵌入式Linux系统编程学习之二十二内存映射
文章目录 前言 一.mmap函数 二.munmap函数 三.补充 前言 内存映射函数包括 mmap.munmap 和 msync,其原型为: #include <unistd.h>#i ...
- 嵌入式Linux系统编程学习之二十五信号量
文章目录 前言 一.System V IPC 机制:信号量 1. semget 函数 2. semop 函数 3. semctl 函数 二.Posix 有名信号量 前言 信号量与信号量集的概念如下 ...
- 嵌入式Linux系统编程学习之二常用命令
嵌入式Linux系统编程学习之二常用命令 文章目录 嵌入式Linux系统编程学习之二常用命令 前言 一.常用命令 1.su(用户切换) 2.useradd(添加用户) 3.passwd(修改密码) 4 ...
- 嵌入式Linux系统编程学习之二十三 System V 共享内存机制
文章目录 前言 一.ftok 函数 二.shmget 函数 三.shmat 函数 四.shmdt 函数 五.shmctl 函数 补充 前言 共享内存也是进程间(进程间不需要有继承关系)通信的一种常 ...
最新文章
- 操作系统 作业调度实验报告
- webpack打包第三方类库的正确姿势
- 我的ASP.NET AJAX控件——PopupNotificationExtender:实现OWA或Messenger样式的信息提示窗口...
- 如何处理SAP云平台错误消息 there is no compute unit quota for subaccount
- 将你的Vim 打造成轻巧强大的IDE
- 【Python CheckiO 题解】Count Consecutive Summers
- 安装php no permision,php安装过程中的No package ‘xxx’ found问题
- 面试官问你HashMap底层你用线程安全吊打他
- matlab 高级函数 —— colfilt/blockproc (图像)矩阵的分块处理
- 前景检测算法(十六)--背景减除结束篇
- 浅谈计算机网络技术应用及发展,【网络技术论文】计算机网络技术的应用及发展(共2891字)...
- VS通过opencv显示图片和打开相机的显示生成dll用unity调用
- TP LINK交换机 console 超级终端链接设置
- 第九届蓝桥杯b组java
- PHP laravel系列之迷你博客搭建
- PHP苹果内购验证步骤
- CASAIM自动化精密尺寸测量设备全尺寸检测铸件自动化检测铸件
- 机器学习算法面经(阿里京东拼多多百度等)
- 春节感悟 - 快递延误的售后问题
- send_nsca passive monitor setup notes
热门文章
- python安装与使用Ta-Lib,获取金融技术面特征
- php yii2 路径问题,yii2常用路径获取
- java届的黄埔军校_法学界的“黄埔军校”:拒绝与985合并,是其最大遗憾
- 利用oc门或od门实现线与_福师《数字逻辑》在线作业二答案
- carbon安装win7 thinkpad x1_联想thinkpad x1 carbon 2017笔记本使用u启动u盘安装win7系统教程...
- java数据结栈空的条件表达式_数据结构——栈和队列例题
- nginx 反向代理之 proxy_redirect
- C# ToString()和Convert.ToString()的区别【转】
- rxjs处理http请求超时
- 【bzoj1572】[Usaco2009 Open]工作安排Job 贪心+堆