【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例
目录
- 管道
- 1. 管道通信
- 1.1 通信模式
- 1.2 管道通信中特殊的名词
- 2. 无名管道(PIPE)
- 2.1 无名管道的通信原理
- 2.2 无名管道特点
- 2.3 如何操作无名管道
- 示例1
- 示例2
- 3. 有名管道(FIFO)
- 3.1 有名管道的特点
- 3.2 如何操作有名管道
- 4. 示例
- 4.1 cut
- 4.1.1 截取出1.txt中前1行的第2个字符
- 4.1.2 截取出指定文件中前n行以”:”进行分割的第n1,n2段内容
- 4.1.2.1 截取出2.txt中前2行以”:”进行分割的第1,2段内容
- 4.1.2.2 截取出指定文件中前4行以”:”进行分割的第1,2,3,4段内容
- 4.2 wc
- 4.3 uniq
- 4.4 tee
- 4.5 tr
- 4.6 生成一个8位的随机密码
- 4.7 查看系统中所有的用户名称,并按字母排序
- 4.8 列出当前用户使用最多的5个命令(print的列数根据实际情况而定)
- 4.9 查看系统中有哪些用户的登陆shell时/bin/bash
- 4.10 查看当前目录的子目录个数
- 4.11 合并两个文件的内容
进程间的通信方式有五种,分别为:管道,信号量,共享内存,消息队列和套接字
管道
把一个程序的输出直接连接在另外一个程序的输入。
管道分为有名管道和无名管道两种,它们的区别是:
无名管道只能在父子进程之间进行通信。
有名管道又称为命名管道,可以在任意两个进程之间进行通信。
1. 管道通信
1.1 通信模式
通信模式 | 通信特点 | 例子 |
---|---|---|
单工 | 数据只在一个方向上传输,不能实现双方通信 | 电视、广播 |
半双工(切换的单工) | 允许数据在两个方向上传输,但是同一时间数据只能在同一个方向上传输 | 对讲机 |
全双工 | 允许数据在两个方向上同时传输 | 手机通话 |
1.2 管道通信中特殊的名词
- 读阻塞(进程阻塞):当管道中没有数据可读时,会产生读阻塞。
- 写阻塞:当管道已满,再往管道中写入数据时,会产生写阻塞。直到有空间可以写入时,再写。
- 管道破裂:只有写端,没有读端。
- 管道中不能使用lseek
2. 无名管道(PIPE)
是一种亲缘进程间的通信方法
2.1 无名管道的通信原理
无名管道存在于kernel中,A,B必须具有亲缘关系进程。同一时刻,只能有一个写端或一个读端。
- kernel的功能模块
内存管理单元(MMU)
主要负责物理内存——>虚拟内存空间的映射
内存的开辟,释放,存储,读取等一系列功能进程管理单元:
task(任务)创建,管理和销毁
任务调度策略:基于时间片的公平的轮转策略
基于优先级的抢占式任务调度策略文件系统
提供用户访问计算机资源的接口(软件)
存储,组织管理计算机文件和设备的软件网络管理
提供网络通信协议栈
驱动模块
硬件设备驱动
父子进程间,只要是fork()出来的,就会完美复制父进程的数据。如果在fork()之前创建管道,并获取管道的操作接口,子进程就能使用管道。
2.2 无名管道特点
- 只能用于具有亲缘关系的进程之间的通信(也就是父子进程和兄弟进程之间)。
- 是一个半双工的通信方式,具有固定的读端和写端。
- 管道可以看做是一种特殊的文件,对管道的读写可以使用普通的read() ,write()函数,但管道不属于任何文件系统的,只存在于内存中。
2.3 如何操作无名管道
- 创建
(pipe函数用来创建无名管道)- 操作
(read读;write写)- 关闭操作端口
(close)
示例1
本例引用于:http://blog.sina.com.cn/s/blog_5ed3e6210100d87d.html
https://blog.csdn.net/zggzgw/article/details/78120171
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<stdlib.h>
#include<sys/wait.h>
void read_pipe(int fd){char message[100];read(fd,message,100);printf("read pipe message:%s",message);}void write_pipe(int fd){char *message="this is Tuesday!\n";write(fd,message,strlen(message)+1);}int main(){int fd[2];pid_t pid;int stat_val;if(pipe(fd)){printf("create pipe failed!\n");}pid=fork();switch(pid){case -1:printf("fork error!\n");break;case 0:close(fd[1]);read_pipe(fd[0]);break;default:close(fd[0]);write_pipe(fd[1]);wait(&stat_val);break;}}
示例2
本引用于自:
https://blog.csdn.net/yangxueyangxue/article/details/122336664
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(void)
{char buf[32] = {0};pid_t pid;// 定义一个变量来保存文件描述符// 因为一个读端, 一个写端, 所以数量为 2 个int fd[2];// 创建无名管道pipe(fd);printf("fd[0] is %d\n", fd[0]);printf("fd[2] is %d\n", fd[1]);// 创建进程pid = fork();if (pid < 0){printf("error\n");} if (pid > 0){int status;close(fd[0]);write(fd[1], "hello", 5);close(fd[1]);wait(&status);exit(0);} if (pid == 0){close(fd[1]);read(fd[0], buf, 32);printf("buf is %s\n", buf);close(fd[0]);exit(0);}return 0;
}
3. 有名管道(FIFO)
是对无名管道的一种改进
3.1 有名管道的特点
- 它可以使互不相关的两个进程实现彼此通信
- 该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立管道之后,两个进程就可以把它当作普通文件进行读写,使用非常方便。
- FIFO严格遵循先进先出原则,对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。有名管道不支持如Iseek()等文件的定位操作。
- 有名管道依然在内核态内存中
- 有名管道在文件系统中有节点(即在跟文件系统中可以找到)
- 有名管道的大小始终为0
- 有名管道的文件类型为p
- 有名管道严格遵循先进先出原则
- 有名管道不能使用文件重定位的函数Iseek
- 有名管道可以用在亲缘和非亲缘进程间(一般用于非亲缘进程间通信)
3.2 如何操作有名管道
- 创建有名管道文件
(mkfifo即是命令也是函数;mknod也可以创建管道文件)- 打开有名管道
(open)- 读/写
(read/write)- 关闭
(close)
本例引用于:
https://blog.csdn.net/yangxueyangxue/article/details/122336664
write01.c
创建两个无关联的进程, 一个进程创建有名管道并写数据, 另一个进程通过管道读数据。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{int ret;char buf[32] = {0};int fd;if (argc < 2){printf("Usage:%s <fifo name> \n", argv[0]);return -1;} if (access(argv[1], F_OK) == -1){ret = mkfifo(argv[1], 0666);if (ret == -1){printf("mkfifo is error \n");return -2;} printf("mkfifo is ok \n");}fd = open(argv[1], O_WRONLY);while (1){sleep(1);write(fd, "hello", 5);} close(fd);return 0;
}
read01.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char *argv[])
{char buf[32] = {0};int fd;if (argc < 2){printf("Usage:%s <fifo name> \n", argv[0]);return -1;} fd = open(argv[1], O_RDONLY);while (1){sleep(1);read(fd, buf, 32);printf("buf is %s\n", buf);memset(buf, 0, sizeof(buf));} close(fd);return 0;
}
4. 示例
以下示例引用于:
https://blog.csdn.net/zsy3757486/article/details/126765536
4.1 cut
根据条件 从命令结果中提取对应内容
4.1.1 截取出1.txt中前1行的第2个字符
head -1 1.txt | cut -c 2
参数 | 含义 |
---|---|
-c | 按字符选取内容 |
4.1.2 截取出指定文件中前n行以”:”进行分割的第n1,n2段内容
head -n 文件名 | cut -d ':' -f n1,n2OR(或者)
head -n 文件名 | cut -d ':' -f n1-n2
范围控制 | 含义 |
---|---|
n | 只显示第 n 段 |
n- | 显示从第 n 段一直到行尾 |
n1-n2 | 显示从第 n1 段到 n2 段 |
4.1.2.1 截取出2.txt中前2行以”:”进行分割的第1,2段内容
head -2 2.txt | cut -d ':' -f 1,2
参数 | 含义 |
---|---|
-d | 指定分隔符 |
-f | 显示指定段落内容 |
4.1.2.2 截取出指定文件中前4行以”:”进行分割的第1,2,3,4段内容
head -4 2.txt | cut -d ':' -f 1-4
4.2 wc
4.3 uniq
4.4 tee
4.5 tr
其下皆由此引用:
https://blog.csdn.net/qq_45171957/article/details/123698265
4.6 生成一个8位的随机密码
tr -dc A-Za-z0-9_ </dev/urandom | head -c 8 | xargs
4.7 查看系统中所有的用户名称,并按字母排序
awk -F: '{print $1}' /etc/passwd | sort
4.8 列出当前用户使用最多的5个命令(print的列数根据实际情况而定)
history | awk '{print $2}' | sort | uniq -u | sort -rn | head -5
4.9 查看系统中有哪些用户的登陆shell时/bin/bash
cat /etc/passwd | grep "/bin/bash" | cut -d: -f1,6
cut -d: -f1,6 表示以:为分隔符显示第1和第6列的内容-d指定分隔符,-f指定列
4.10 查看当前目录的子目录个数
ls -l | cut -c 1 | grep "d" | wc -l
ls -l 长格式列出当前目录的所有内容,每行的第一个字符表示文件的类
cut -c 1 截取每行的第一个字符
grep “d” 获取文件类型是目录的行
wc -l 统计grep命令输出的行数,即子目录个数
4.11 合并两个文件的内容
cat 1.txt | paste -d: 2.txt -
paste -d: 2.txt - 表示以:为分割符合并两个文件,合并时2.txt文件的内容在前
-代表1.txt文件
【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例相关推荐
- linux程序间管道通信,linux进程间通信——管道 详解
管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入.常说的管道多是指无名管道, 无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别. 有名管道叫nam ...
- 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——2.5 WM8960音频编解码芯片...
本节书摘来自异步社区<嵌入式Linux软硬件开发详解--基于S5PV210处理器>一书中的第2章,第2.5节,作者 刘龙,更多章节内容可以访问云栖社区"异步社区"公众号 ...
- 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——2.2 DDR2 SDRAM芯片
本节书摘来自异步社区<嵌入式Linux软硬件开发详解--基于S5PV210处理器>一书中的第2章,第2.2节,作者 刘龙,更多章节内容可以访问云栖社区"异步社区"公众号 ...
- 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——1.2 S5PV210处理器
本节书摘来自异步社区<嵌入式Linux软硬件开发详解--基于S5PV210处理器>一书中的第1章,第1.2节,作者 刘龙,更多章节内容可以访问云栖社区"异步社区"公众号 ...
- c linux time微秒_学习linux,看这篇1.5w多字的linux命令详解(6小时讲明白Linux)
用心分享,共同成长 没有什么比每天进步一点点更重要了 本篇文章主要讲解了一些linux常用命令,主要讲解模式是,命令介绍.命令参数格式.命令参数.命令常用参数示例.由于linux命令较多,我还特意选了 ...
- 云计算概念及Linux系统详解
云计算概念及linux系统详解 先来看一下维基百科上的定义: 云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问,进入可配置的网络.服务器.存储.应用软件.服务等能够被快速提供 ...
- Linux系统调用详解(实现机制分析)
为什么需要系统调用 linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似,只是系统调用由操作系统核心提供,运行于内核态,而普通的函数调用由函数库或用户 ...
- Linux系统结构 详解
Linux系统结构 详解 标签: 产品产品设计googleapple互联网 2011-01-07 14:14 31038人阅读 评论(6) 收藏 举报 分类: Linux(21) 版权声明:本文为博主 ...
- Linux: 系统结构详解
Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统.部分层次结构如图1-1所 ...
最新文章
- Dosbox+Masm汇编语言
- Linux基础系列(四)系统用户和组管理
- python图标-python实现的简版iconv
- 剑指Offer——合并两个排序的链表
- Citrix XenApp 下载及一年 developer license 获取
- 引用和指针-内存的分配方式有几种
- 以 library 方式启动的 SAP Spartacus Storefront,如何手动实现 User 模块的延迟加载
- 使用 ML.NET 识别乐高颜色块
- javascript学习系列(24):数组中的substring方法
- 离模拟世界又近一步!谷歌推出开源量子计算平台OpenFermion
- 三层架构学习的困难_TCP/IP协议栈-之-三层交换技术
- react-native windows下环境搭建和现阶段开发测试问题汇总(持续更新)
- java毕业设计开题报告SSM图书馆预约占座系统
- python计算银行余额_Python:将银行扣费信息整理成账单
- 100+个程序员开发必备参考手册(在线及下载)
- 计算机应用基础项目化教程ppt,计算机应用基础项目化教程_课件
- echarts饼状图设置位置
- 制作字幕.html教程,怎样制作视频字幕
- 老子文化主题公园将在洛阳落户
- HTML5 新特性: Web Worker 的创建与使用(webpack + TS 环境)
热门文章
- mybatis 丢失最后一个属性为空_热血传奇:游戏中那些盛传带有隐藏属性的装备,最后一个最坑?...
- docker 批量启动容器
- 保姆级教学—扫雷游戏的实现
- orcale数据库常用查询语句
- 全球地震及地质灾害实时CSV/JSON/KML数据【免费下载】
- http、https、ftp、talnet的默认端口号
- c语言程序的核心思想是什么,c语言程序设计心得(2)
- php重定向本地地址不变,php重定向不会更改网址
- Driftnet学习笔记
- display android,iDisplay官网下载