<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 6》(10)

《Linux操作系统原理分析之Linux 进程管理 6》(10)

  • 4 Linux 进程管理
    • 4.6 Linux 管道
      • 4.6.1 管道的概念
      • 4.6.2 无名管道
        • 1.终端使用
        • 2.程序中使用
      • 4.6.2 命名管道
        • 1.终端使用
        • 2.程序中使用

4 Linux 进程管理

4.6 Linux 管道

4.6.1 管道的概念

1、管道是 linux 进程通信的一种手段
2、管道通信时,一端写管道进程,另一端读管道进程,获取数据。
3、管道本质是共享文件。
4、管道以文件系统为基础实现。
5、数据在管道中先进先出方式,以字符流形态传送。

在这里插入图片描述
管道分两种:无名管道、命名管道。它们的内部结构是一致的,但是用方式不同。

无名管道:只能在父子进程之间通信
命名管道:可以在任意进程间通信。

4.6.2 无名管道

linux 管道可以在终端的命令行中使用,也可以在程序中使用。

1.终端使用

无名管道连接两个命令,如下命令中“|”就是管道

$ls –l | more 
2.程序中使用

在程序设计中无名管道的建立由系统调用 pipe()实现,其定义:

#include <unstd.h>
Int pipe(int filedes[2]);

其中 filedes[]是具有两个元素的 int 型数组。在调用 pipe()建立一个无名管道后,使用两个文件标识号来表示管道的两端(一端写,一端读),并记入 filedes[]中。其中 filedes[0]是读取管道的文件标识号,filedes[1]是写入管道的文件标识号。

说明::::
父子进程使用无名管道通信是建立在子进程继承父进程资源的基础上。父子进程通信时,必须先建立管道,再创建子进程。
使用管道时必须确定管道通信的方向,且一旦确定后不能改变。
父子进程中一个进程只能使用一个文件标识号,所以另一个不使用的标识号可以使用系统调用close()关闭它。

在这里插入图片描述

举例:在该例中,父进程建立管道后创建一个子进程。子进程的任务是把一组字符串信息写入管道,父进程在子进程完成任务终止后,从管道中读取信息并显示在显示器上。

#include <stdio.h>
Main()
{
Pid_t pid;
Int fds[2];
Char buf1[50],buf2[50];
Pipe(fds); /*建立无名管道*/
If((pid=fork())<0/*创建子进程失败,程序终止*/
{
Printf(“Fork() Error\n”);
Exit1);
}
Else if(pid==0) /*子进程*/
{
Close(fds[0]); /*关闭不使用的文件标识号*/
Sprintf(buf1,”these are transmitted data\n”); /*把信息写入缓冲区 buf1*/
Write(fds[1],buf1,50); /*把缓冲区 buf1 中的信息写入管道*/
Exit1/*子进程终止*/
}
Else
{
Close(fds[1]); /*关闭不使用的文件标识号*/
Wait0); /*等待子进程结束*/
Read(fds[0],buf2,50); /*读管道信息并把信息置入 buf2*/
Printf(“%s\n”,buf2);/*显示 buf2 中的信息*/
}
}

说明:

1、无名管道与一般文件不同,它没有纳入文件系统的目录,不占用外存空间,仅使用内存作为数据传输的缓冲区。

2、缓冲区的大小决定每次写入管道的字节数。该值由全局符号常量 PIPE BUF 确定。 缺省值为一个物理页面。

3、由文件系统管理,但此时没有文件系统知识基础,故暂时不讲详细管理

4.6.2 命名管道

又称 FIFO 管道。命名管道与无名管道的区别:命名管道有文件名,在文件系统中可见;可以实现任意进程间的通信。

1.终端使用

使用 mkfifo 建立一个命名管道。
例:$mkfifo myfifo;/*建立一个名字为 myfifo 的管道。
此时使用 ls 命令,就可以查看到该文件信息。

$ls –l myfifo
prw-r---- wang user 0 fen 22 1345 myinfo /*第一个字符 p,表示是 FIFO 文件
在命名管道建立后,就可以用它在两个进程间进行通信。如:
$cut –c1-5< myfifo&
$cat file1 >myfifo
其中 cat 命令把文件 file1 的内容写入管道 myfifo,命令 cut 从管道 myfifo 中读出文件的内容进行裁剪后显示每行的前 1~5 个字符。
2.程序中使用

1)建立命名管道
方法一:调用 C 函数 mkfifo()实现的,其定义如:

#include <sys/state.h>
Int mkfifo(const char *path, mode_t mode);

其中:
path:指明要创建的命名管道的路径和名字;
mode:指明管道访问的权限。 创建成功返回 0,否则为负数。 另一种方法:使用
linux 系统调用 mknod() mknod()可以建立任何类型的文件,在建立命名管道时使用的形式如下:
mknod(path,mode|S_FIFO,0); 参数含义与上同,其中 S_FIFO 表示建立 FIFO 文件。
这两种方法作用基本相同:建立命名管道的目录结构、inode 节点、file 文件结构体等。

2)打开管道

由于任何进程都可以通过命名管道进行通信,所以在使用命名管道时,必须先打开它,由系统调用open()实现。

openchar *path, int mode)

其中: path:指明要使用的命名管道的路径和名字;
mode:指明管道访问的模式:O_RDONLY(只读)、O_WRONLY(只写)
创建成功返回文件标识号,否则为负数。 注:在使用文件操作对管道进行各种操作时,要使用文件标识号,而不是管道名。

例:有两个程序,其中 wrfifo.c 把一组信息写入管道,另一个程序 rdfifo.c 把管道中的信息读出后显示在
屏幕上。

/*读管道程序 rdfifo.c*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
Main(void)
{
Int fd,len;
Char buf[PIPE_BUF];
Mode_t mode=0666;
If(mkfifo(“fifo1”,mode)<0)
{
Printf(“mkfifo error\n”);
Exit(1);
}
If((fd=open“fifo1”,O_RDONLY))<0
{
Printf(“pipe open error\n”);
Exit(1);
}
While(len=(read(fd,buf,PIPE_BUF-1)>0)
Printf(“read fifo pipe: %s”,buf);
Close(fd);
}
/*写管道程序 wdfifo.c*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
Main(void)
{
Int fd,len;
Char buf[PIPE_BUF];
Mode_t mode=0666;
If((fd=open(“fifo1”,O_WRONLY))<0
{
Printf(“pipe open error\n”);
Exit(1);
}
For(i=0;i<3;i++{
Len=sprintf(buf,”write fifo pipe from %d at %d times\n”,getpid(),i+1);
Write(fd,buf,len+1);
}
Close(fd);
}
在 linux 终端上运行这两个程序:
$./rdfifo&
$./wrfifo
结果:
Write fifo pipe from 945 at 1 times
Write fifo pipe from 945 at 2 times
Write fifo pipe from 945 at 3 times

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/177183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019年10月17日: Go生态洞察:在Go 1.13中处理错误

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Mysql数据库多表数据查询问题

1、背景 线上某个业务数据分表存储在10个子表中&#xff0c;现在需要快速按照条件&#xff08;比如时间范围&#xff09;筛选出所有的数据&#xff0c;主要是想做一个可视化的数据查询工具&#xff0c;给产研团队使用。 2、实践 注意&#xff1a;不要在线上真实数据库操作&am…

用户选择PowerFlex的十大理由

既有高性能      满足AI、VDI、数据库等工作负载      又有开放架构      4个节点起步可扩展至上千节点      支撑起不断变化的新兴应用负载      还能与云互通      实现云上云下互联      Dell PowerFlex      连续八季度销量增长      …

提升企业文档处理效率,尽在Readiris PDF Corporate下载

在现代企业中&#xff0c;大量的文档处理工作是不可避免的。然而&#xff0c;传统的文档处理方法往往效率低下&#xff0c;浪费了企业宝贵的时间和资源。为了帮助企业提升文档处理效率&#xff0c;我们推荐使用Readiris PDF Corporate软件。 Readiris PDF Corporate是一款功能…

HarmonyOS 应用模型开发指南介绍

一、基本概念解析 新版文档中的知识点&#xff0c;介绍更全面&#xff0c;逻辑更清晰&#xff0c;提供了各类基本概念解析&#xff0c;帮助开发者更快学习、掌握系统能力。以下是新版文档部分概念展示。 1、HAP是什么&#xff1f; 开发者通过DevEco Studio把应用程序编译为一…

企企通相继出席首届百家新锐企业融通创新交流会与采购数字化创新沙龙,持续深化数字赋能

近期&#xff0c;企企通受邀分别参加了广州、上海业界重磅活动&#xff0c;针对新形势下企业数字化采购升级的新技术与新思路、产业链上下游协同发展等进行探讨&#xff0c;赋能数字化信息技术产业生态发展&#xff0c;并对各方主体如何协作共赢助推企业数字化发展建言献策。 0…

AMP State Evolution的计算:以伯努利先验为例

AMP State Evolution (SE)的计算 t 1 t1 t1时&#xff0c; E ( t ) E [ X 2 ] \mathcal E^{(t)} \mathbb E [X^2] E(t)E[X2]&#xff0c;SE的迭代式为 τ r ( t ) σ 2 1 δ E ( t ) E ( t 1 ) E ∣ η ( t ) ( X Z ) − X ∣ 2 , Z ∼ N ( 0 , τ r ( t ) ) \begin{a…

JVM运行时数据区域、对象内存分配、内存溢出异常总结

深入理解java虚拟机第二章 二、运行时数据区域2.2.1 程序计数器2.2.2 Java虚拟机栈2.2.3 本地方法栈2.2.4 Java堆2.2.5 方法区2.2.6 运行时常量池2.2.7 直接内存 三、HotSpot虚拟机对象解密2.3.1 对象的创建对象如何分配内存&#xff1f;对象的创建如何处理并发问题&#xff1f…

vue3父子组件通过$parent与ref通信

父组件 <template><div><h1>ref与$parents父子组件通信 {{ parentMoney }}</h1><button click"handler">点击我子组件的值会减20</button><hr><child ref"children"></child></div> </te…

深度学习之图像分类(十五)DINAT: Dilated Neighborhood Attention Transformer详解(一)

Dilated Neighborhood Attention Transformer Abstract Transformers 迅速成为跨模态、领域和任务中应用最广泛的深度学习架构之一。在视觉领域&#xff0c;除了对普通Transformer的持续努力外&#xff0c;分层Transformer也因其性能和易于集成到现有框架中而受到重视。这些模…

centos用什么命令可查看版本号

概述 查版本号的命令&#xff1a;1、“cat /etc/redhat-release”&#xff0c;可输出centos版本号&#xff1b;2、“cat /proc/version”、“uname -a”或“uname -r”&#xff0c;可输出内核版本号。 本教程操作环境&#xff1a;centos7.9.2009系统。 查看centos版本 [roo…

text2cypher

你是一位 Neo4j Cypher 专家&#xff0c;请根据给定的图 Schema 和问题&#xff0c;写出查询语句。 schema 如下&#xff1a; --- {schema} --- 问题如下&#xff1a; --- {question} --- 用户: 百日咳有什么症状? chatGPT: 百日咳的症状包括&#xff1a;惊厥&#xff1b;吸气…

【 C 语言经典100例】C 练习实例2

题目&#xff1a;企业发放的奖金根据利润提成。 利润(I)低于或等于10万元时&#xff0c;奖金可提10%&#xff1b; 利润高于10万元&#xff0c;低于20万元时&#xff0c;低于10万元的部分按10%提成&#xff0c;高于10万元的部分&#xff0c;可提成7.5%&#xff1b; 20万到40万之…

python每日一题——11滑动窗口最大值

题目 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3…

GPIO的使用--操作PF09 PF10 PF08实现呼吸灯、跑马灯、警报闪烁灯

先来个呼吸灯演示 呼吸灯 目录 一、GPIO的介绍 1.含义 2.控制原理 3.控制流程 二、LED控制 1.呼吸灯 操作代码 烧录结果 2.蜂鸣器红绿灯交替 操作代码 3.红绿灯交替闪烁 操作代码 一、GPIO的介绍 1.含义 GPIO(general porpose intput output),通用输入输出端口。…

6-4 jmu-python-发牌

6-4 jmu-python-发牌 分数 20 作者 蔡莉白 单位 集美大学 从键盘输入一个整数作为随机种子&#xff0c;随机生成一副扑克牌&#xff08;去掉大小王&#xff09;&#xff0c;循环分给4位牌手&#xff0c;每人5张牌&#xff08;第1、5、9、13、17张牌给第一个玩家&#xff0c;第2…

AI超级个体:ChatGPT与AIGC实战指南

目录 前言 一、ChatGPT在日常工作中的应用场景 1. 客户服务与支持 2. 内部沟通与协作 3. 创新与问题解决 二、巧用ChatGPT提升工作效率 1. 自动化工作流程 2. 信息整合与共享 3. 提高决策效率 三、巧用ChatGPT创造价值 1. 优化产品和服务 2. 提高员工满意度和留任率…

Slf4j使用Logback时,Logback如何初始化

前言 Slf4j SLF4J&#xff0c;全称 Simple Logging Facade for Java&#xff0c;是一个用于Java编程语言的日志系统抽象层。它为多种现有日志框架&#xff08;例如Log4j、java.util.logging等&#xff09;提供了统一的接口, 但自身并不实现日志功能。 SLF4J 允许用户在部署时…

ArkUI 如何将$r(’app.string.xxx‘) 转成string字符串

一、正常引用字符串资源文件内容 在 ArkUI 中&#xff0c;string.json 中的字符串资源正常情况下使用如下方式引用&#xff1a; Entry Component struct LoginPage {build() {Column() {Text($r(app.string.title))}}}二、资源转string类型 上面的代码没问题是因为 Text(con…

如何通过内网穿透实现公网远程ssh连接kali系统

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过[cpolar 内网穿透](cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站)软件实现ssh远程连接kali 1…