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

这篇具有很好参考价值的文章主要介绍了【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

进程间的通信方式有五种,分别为:管道,信号量,共享内存,消息队列和套接字

管道

把一个程序的输出直接连接在另外一个程序的输入。

管道分为有名管道和无名管道两种,它们的区别是:

无名管道只能在父子进程之间进行通信。
有名管道又称为命名管道,可以在任意两个进程之间进行通信。

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
【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例
【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例
【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例

#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
【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例
【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例

#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

【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例
【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例
【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例
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 按字符选取内容

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

4.1.2 截取出指定文件中前n行以”:”进行分割的第n1,n2段内容
head -n 文件名 | cut -d ':' -f n1,n2
                 OR(或者)
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 显示指定段落内容

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

4.1.2.2 截取出指定文件中前4行以”:”进行分割的第1,2,3,4段内容
head -4 2.txt | cut -d ':' -f 1-4

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

4.2 wc

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

4.3 uniq

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

4.4 tee

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

4.5 tr

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

其下皆由此引用:
https://blog.csdn.net/qq_45171957/article/details/123698265

4.6 生成一个8位的随机密码

tr -dc A-Za-z0-9_ </dev/urandom | head -c 8 | xargs

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

4.7 查看系统中所有的用户名称,并按字母排序

awk -F: '{print $1}' /etc/passwd | sort

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

4.8 列出当前用户使用最多的5个命令(print的列数根据实际情况而定)

history | awk '{print $2}' | sort | uniq -u | sort -rn | head -5

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

4.9 查看系统中有哪些用户的登陆shell时/bin/bash

cat /etc/passwd | grep "/bin/bash" | cut -d: -f1,6

cut -d: -f1,6 表示以:为分隔符显示第1和第6列的内容-d指定分隔符,-f指定列

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

4.10 查看当前目录的子目录个数

ls -l | cut -c 1 | grep "d" | wc -l

ls -l 长格式列出当前目录的所有内容,每行的第一个字符表示文件的类
cut -c 1 截取每行的第一个字符
grep “d” 获取文件类型是目录的行
wc -l 统计grep命令输出的行数,即子目录个数

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

4.11 合并两个文件的内容

cat 1.txt | paste -d: 2.txt -

paste -d: 2.txt - 表示以:为分割符合并两个文件,合并时2.txt文件的内容在前
-代表1.txt文件

【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例文章来源地址https://www.toymoban.com/news/detail-479245.html

到了这里,关于【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式系统复习要点

    目录 1、嵌入式系统的核心部分主要由硬件和软件两部分组成: 2、嵌入式系统硬件: 3、嵌入式处理器从体系上分类,可以分为冯·诺依曼结构和哈佛结构两种: 4、几类常见的嵌入式处理器类型: 5、MCU组成结构: 7、DSP组成结构: 8、SoC组成结构: 9、MPU组成结构: 10、嵌入

    2024年02月12日
    浏览(38)
  • 期末复习【嵌入式系统】

    初稿:2023-6-30 16:58:07 终稿:2023-7-3 16:30:49 本专栏将于考试期间设置为付费 考试结束后关闭付费 时间为2023/7/7 以下内容源自《【嵌入式系统】》 仅供学习交流使用 需要复习的pdf(包含书签和高亮标注),可以私信我,无偿提供 第一章 习题【嵌入式系统】 第二章 习题【嵌入

    2024年02月12日
    浏览(46)
  • 西邮嵌入式系统复习

    可以私聊我获取pdf版本! 提示:这里可以添加本文要记录的大概内容: 期末复习知识点总结 第一次整理 提示:以下是本篇文章正文内容,下面案例可供参考 1.1.0 嵌入式系统发展 (选择 4个阶段) 无操作系统的单片机阶段–以微控制器为基础、以简单操 作系统为核心的嵌入

    2024年02月15日
    浏览(37)
  • 【嵌入式系统】 期末复习提纲

    1、嵌入式系统的概念 以应用为中心、以计算机技术为基础、软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 2、了解ARM体系结构的演变进程 1991年开始共推出7个版本,V1~V3未用于商业授权。V4T开始商业授权,T表示16位Thumb指令,

    2024年02月08日
    浏览(41)
  • 南邮-嵌入式复习附录/习题

    附录1-6 内容可能有误,欢迎大家指正。 (1)ARM汇编程序由 机器 指令、 汇编 指令和 伪 指令构成。 (2)ARM伪指令可以分为以下几类:符号定义伪指令、数据定义伪指令、汇编控制伪指令和宏指令等。 (3)假设存储数据0x12345678于ARM微处理器内存0X30000000开始的位置,则0X3

    2024年02月05日
    浏览(34)
  • 嵌入式期末复习(四)简答题

    1.ARM公司全称是什么,商业模式是什么?列举ST公司常用的ARM内核单片机型号? (1)全称: Ad va nced RISC Machines ) (2)商业模式:为产品做设计,知识产权付费 (3)stm32f101c8t6、stm32f103rct6、stm32f104zet6 2.冯诺依曼结构和哈佛结构区别? (1)冯诺依曼结构:指令和数据合并在

    2024年02月02日
    浏览(40)
  • 【嵌入式系统】课程复习资料整理

    【嵌入式系统】课程复习资料整理 一、绪论 1.定义 从技术的角度定义:以应用为中心、以计算机技术为基础、软件硬件可裁剪、对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 从系统的角度定义:嵌入式系统是设计完成复杂功能的硬件和软件,并使其紧密

    2024年02月03日
    浏览(44)
  • 嵌入式期末复习题(一)选择题

    1.ARM Cortex-M3不可以通过( D  )唤醒CPU。 A.I/O端口    B.RTC 闹钟    C.USB唤醒事件 D.PLL 2 .   STM32F103 微控制器是基于(   A   )内核的 32 位微处理器。 A.Cortex-M3   B. Cortex-M4   C. Cortex-M6  D . Cortex-M8 3 .下面 哪种开发方式不适合STM32F103系列微处理器的开发?( 

    2024年02月03日
    浏览(42)
  • 嵌入式系统期末复习知识点整理(一)

    1-8答案: 1、嵌入性 专用性 计算机系统 2、专用计算机系统 3、系统能够在限定的相应时间内提供所需水平的服务 us~ms ms~s s级以上 4、嵌入式处理器、外围硬件设备、嵌入式操作系统(可选)、用户的应用软件系统 5、非实时系统、硬实时系统、软实时系统 6、将程序和数据存

    2024年02月05日
    浏览(56)
  • 嵌入式学习之C语言指针部分复习

    今天主要把C语言的指针部分再次认真的复习了一下,对于指针的整体框架有了更加深刻的理解,特别要重点区分函数指针,指针函数,数组指针,指针数组部分,对于这部分的应用非常重要,而且C语言指针部分是面试的重中之重,所以要加强练习才行。 今天的学习是充满动

    2024年02月12日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包