【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例

article/2025/9/23 2:58:18

目录

  • 管道
    • 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 管道通信中特殊的名词

  1. 读阻塞(进程阻塞):当管道中没有数据可读时,会产生读阻塞。
  2. 写阻塞:当管道已满,再往管道中写入数据时,会产生写阻塞。直到有空间可以写入时,再写。
  3. 管道破裂:只有写端,没有读端。
  4. 管道中不能使用lseek

2. 无名管道(PIPE)

是一种亲缘进程间的通信方法

2.1 无名管道的通信原理

无名管道存在于kernel中,A,B必须具有亲缘关系进程。同一时刻,只能有一个写端或一个读端。

  1. kernel的功能模块

内存管理单元(MMU)

主要负责物理内存——>虚拟内存空间的映射
内存的开辟,释放,存储,读取等一系列功能

进程管理单元:

task(任务)创建,管理和销毁
任务调度策略:

基于时间片的公平的轮转策略
基于优先级的抢占式任务调度策略

文件系统

提供用户访问计算机资源的接口(软件)
存储,组织管理计算机文件和设备的软件

网络管理

提供网络通信协议栈

驱动模块

硬件设备驱动

父子进程间,只要是fork()出来的,就会完美复制父进程的数据。如果在fork()之前创建管道,并获取管道的操作接口,子进程就能使用管道。

2.2 无名管道特点

  1. 只能用于具有亲缘关系的进程之间的通信(也就是父子进程和兄弟进程之间)。
  2. 是一个半双工的通信方式,具有固定的读端和写端。
  3. 管道可以看做是一种特殊的文件,对管道的读写可以使用普通的read() ,write()函数,但管道不属于任何文件系统的,只存在于内存中。

2.3 如何操作无名管道

  1. 创建
    (pipe函数用来创建无名管道)
  2. 操作
    (read读;write写)
  3. 关闭操作端口
    (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 有名管道的特点

  1. 它可以使互不相关的两个进程实现彼此通信
  2. 该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立管道之后,两个进程就可以把它当作普通文件进行读写,使用非常方便。
  3. FIFO严格遵循先进先出原则,对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。有名管道不支持如Iseek()等文件的定位操作。
  1. 有名管道依然在内核态内存中
  2. 有名管道在文件系统中有节点(即在跟文件系统中可以找到)
  3. 有名管道的大小始终为0
  4. 有名管道的文件类型为p
  5. 有名管道严格遵循先进先出原则
  6. 有名管道不能使用文件重定位的函数Iseek
  7. 有名管道可以用在亲缘和非亲缘进程间(一般用于非亲缘进程间通信)

3.2 如何操作有名管道

  1. 创建有名管道文件
    (mkfifo即是命令也是函数;mknod也可以创建管道文件)
  2. 打开有名管道
    (open)
  3. 读/写
    (read/write)
  4. 关闭
    (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文件

在这里插入图片描述


http://chatgpt.dhexx.cn/article/Lp3CgpW5.shtml

相关文章

linux命令管道工作原理与使用方法

一、管道定义 管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性&#xff0c;管道又称为半双工管道。管道的这一特点决定了器使用的局限性。管道是Linux支持的最初Unix IPC形式之一&#xff0c;具有以下特点&#xff1a; *** 数据只能由一个进程流向另一个进程…

Linux管道

目录 1.管道概念 2.管道分类 1.匿名管道 1.基本实现与概念 2.站在文件描述符角度-深度理解管道 3.站在内核角度-管道本质 4.管道读写规则 5.管道属性设置与阻塞验证 6.管道特点(匿名) 2.命名管道 1.创建一个命名管道 2.命名管道的打开规则 3.匿名管道与命名管道的区别…

linux中管道的概念,浅谈Linux管道

通过前面的学习&#xff0c;我们已经知道了怎样从文件重定向输入&#xff0c;以及重定向输出到文件。Shell 还有一种功能&#xff0c;就是可以将两个或者多个命令&#xff08;程序或者进程&#xff09;连接到一起&#xff0c;把一个命令的输出作为下一个命令的输入&#xff0c;…

linux管道举例理解

linux管道举例理解 一、管道的定义&#xff1a;“|”二、查找2.1统计当前目录下有多少个文件2.2查看当前目录下的前n&#xff08;3&#xff09;个文件2.3查看wang.txt文件包含i的字符行2.4查看内存使用情况2.5查询进程 三、更改 https://blog.csdn.net/hanhanwanghaha宝藏女孩 …

图解YUV格式

YUV格式有两大类&#xff1a;planar和packed。 对于planar的YUV格式&#xff0c;Y&#xff0c;U&#xff0c;V都是连续存放的&#xff0c;比如 YYYYUUUUVVVV 对于packed的YUV格式&#xff0c;每个像素点的Y,U,V是连续交替存储的。 RGB24&#xff0c;BGR24等等都是packed方式存…

走进音视频的世界——RGB与YUV格式

在图像的世界里&#xff0c;一般使用RGB作为存储格式。而在视频的世界里&#xff0c;一般使用YUV作为压缩存储格式。有时候面试官会问&#xff1a;为什么视频使用YUV来压缩存储&#xff0c;而不用RGB&#xff1f;YUV与RGB有什么区别&#xff0c;两者如何转换的&#xff1f;常见…

YUV格式像素

一幅彩色图像的基本要素是什么&#xff1f; 说白了&#xff0c;一幅图像包括的基本东西就是二进制数据&#xff0c;其容量大小实质即为二进制数据的多少。一幅1920x1080像素的YUV422的图像&#xff0c;大小是1920X1080X24147200&#xff08;十进制&#xff09;&#xff0c;也就…

查看YUV格式文件

RGB图片文件转换为YUV格式后&#xff0c;将YUV数据以二进制形式写到文件中&#xff0c;使用7yuv软件查看。 #include<iostream> #include<cstdio> #include<string> #include"opencv2/opencv.hpp"#include "libyuv/scale.h" #include &…

详解YUV数据格式

在博客园看到有大神写了一篇关于YUV图像格式的博客&#xff0c;图文分析很不错&#xff0c;这里就转载过来了。但排版有些乱&#xff0c;所以我就在原博文的基础上做了一些排版&#xff0c;修改 了一些错误。希望我们能共同进步。come on&#xff01;&#xff01; 一.YUV数据…

YUV格式的图片查看工具YUView 2.13

YUV格式的图片查看工具YUView 2.13 参考资料&#xff1a; Image to YUV (ffmpeg/ImageMagick) 这2个工具可用于音视频格式转换等处理 Image to YUV (ffmpeg/ImageMagick)_hushui的博客-CSDN博客 FFmpeg常用命令/参数 https://blog.csdn.net/weixin_36811328/article/details/88…

YUV文件格式

原文&#xff1a;YUV图像格式的博客 转&#xff1a;https://blog.csdn.net/armwind/article/details/52190123&#xff0c;文章不错特转载过来备忘 一.YUV数据格式的定义和采集方式 1&#xff09;YUV数据格式定义 YUV分为三个分量&#xff0c;“Y”表示明亮度&#xff08;Lu…

关于YUV格式的一些总结

关于YUV格式的一些总结 一、YUV和YCbCr1、定义2、区别和联系 二、不同的采样格式1、YUV4442、YUV4403、YUV4224、YUV4205、YUV4116、YUV410 三、YUV数据排列格式1、四种数据排列方式①Planar Format②Semi-Planar Format③Tiled Semi-Planar Format④Interleaved Format 2、常用…

音视频基础之YUV格式

1 YUV格式 1.1 YUV简介 YUV是一种颜色编码方式&#xff0c;类似于RGB颜色编码方式。YUV将亮度和色度分离&#xff0c;使用Y&#xff08;明亮度&#xff09;、U和V&#xff08;色度、浓度&#xff09;三个分量表示一个颜色。三个分量中UV分量只有颜色信息&#xff0c;如果图像只…

YUV格式与RGB格式

YUV与RGB格式介绍 一、RGB编码格式二、YUV编码格式YUV存储格式&#xff08;分类&#xff09;&#xff1a;YUV采样方式&#xff1a;常见的YUV格式 三、RGB与YUV转换公式 一、RGB编码格式 RGB图像具有三个通道 R、G、B&#xff0c;分别对应红、绿、蓝三个分量&#xff0c;由三个…

YUV数据格式介绍

YUV图像数据格式介绍 1.yuv格式的分类和介绍 2.YUV三个分量的代表含义 Y分量&#xff1a;表示明亮度&#xff08;Luma&#xff09;即灰度值 UY分量&#xff1a;表示色彩和饱和度即图片的颜色 U颜色代表 blue Y 颜色代表red YUV从形式上也可以用YCbCr 表示 3.常见的YUV格式…

YUV 格式详解-史上最全

YUV 格式详解 介绍分类标准具体分类I420&#xff08;属于 YUV 420 Plannar&#xff09;YV12&#xff08;属于 YUV 420 Plannar&#xff09;NV12&#xff08;属于 YUV 420 Semi-Planar&#xff09;NV21&#xff08;属于 YUV 420 Semi-Planar&#xff09;I422&#xff08;属于 YU…

YUV格式说明 YUYV JPEG

YUV420P&#xff0c;Y&#xff0c;U&#xff0c;V三个分量都是平面格式&#xff0c;分为 I420 和 YV12 。 I420 格式和 YV12 格式的不同处在U平面和V平面的位置不同。在I420格式中&#xff0c;U平面紧跟在Y平面之后&#xff0c;然后才是V平面&#xff08;即&#xff1a…

视频YUV格式详解

YUV三种存储格式 yuv按照存储格式的不同分为三类&#xff0c;平面&#xff0c;半平面和打包格式三种格式。其中I420就是一种平面格式。 平面的YUV格式&#xff0c;就是YUV三种分量分别单独的连续存储&#xff0c;不交叉。先连续存储所有像素点的Y&#xff0c;紧接着存储所有像…

YUV图像的常见格式(图示)

摘要 在研究android Camera2 API的时候&#xff0c;涉及到采集视频信息。其中&#xff0c;在采集视频的时候&#xff0c;可以设置多种类型格式的图像数据&#xff0c;其中一个就是yuv_420_888&#xff0c;如果需要进行编码压缩&#xff0c;我们还需要将该格式的数据转转想要的…

YUV图像格式详解

一、YUV格式 YUV格式有两大类&#xff1a;packed(打包)格式和planar(平面)格式。 packed&#xff1a;通常是几个相邻的像素组成一个宏像素&#xff08;macro-pixel&#xff09;&#xff0c;每个像素点的Y、U、V是连续交*存储的。 planar&#xff1a;使用三个数组分开存放Y、…