<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.hqwc.cn/news/225421.html

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

相关文章

MEFLUT: Unsupervised 1D Lookup Tables for Multi-exposure Image Fusion

Abstract 在本文中&#xff0c;我们介绍了一种高质量多重曝光图像融合&#xff08;MEF&#xff09;的新方法。我们表明&#xff0c;曝光的融合权重可以编码到一维查找表&#xff08;LUT&#xff09;中&#xff0c;该表将像素强度值作为输入并产生融合权重作为输出。我们为每次…

docker基础快速入门:基础命令、网络、docker compose工具

docker基础命令快速入门 目录 docker基本命令docker 网络docker compose Docker介绍 Docker是一个虚拟环境容器&#xff0c;可以将你的开发环境、代码、配置文件等一并打包到这个容器中&#xff0c;并发布和应用到任意平台中。 Docker的三个概念 镜像 Docker镜像是一个特…

来自2023 TM Forum 数字领导力中国峰会的邀请函

峰会介绍 2023数字领导力中国峰会由tmforum和亚信科技联合主办。 数据驱动创新&#xff0c;数字塑造未来&#xff01;2023数字领导力中国峰会&#xff0c;立足技术和商业视角&#xff0c;聚焦讨论各行业如何依托数据治理、IT和网络转型&#xff0c;实现跨越式增长。 这里&am…

Elasticsearch初识--CentOS7安装ES及Kibana

文章目录 一&#xff0e;前言二&#xff0e;介绍1.Elasticsearch2.Kibana 三&#xff0e;ES安装1.下载安装包2.解压、配置2.1 解压2.2 配置 3.启动3.1增加用户3.2启动 4.解决资源分配太少问题5.启动成功 四&#xff0e;Kibana安装1.下载安装包2.解压、配置2.1 解压2.2 配置2.2 …

如何进行无代码开发?有哪些无代码开发工具和无代码软件开发平台?

无代码开发是指不写代码&#xff0c;通过可视化工具进行应用程序开发。无代码开发让非技术用户通过拖拽和选择等简单操作&#xff0c;就能快速创建应用程序。 如何学习无代码开发 随着科技的不断发展&#xff0c;新的技术和工具不断涌现&#xff0c;无代码开发就是其中一种。掌…

RT-DETR优化改进:IOU创新篇 | 引入MPDIou、WIoU、SIoU、EIoU、α-IoU,在不同场景实现涨点

🚀🚀🚀本文改进:引入MPDIou、WIoU、SIoU、EIoU、α-IoU,适配RT-DETR 🚀🚀🚀MPDIou、WIoU、SIoU、EIoU、α-IoU在各个场景都能够有效涨点 🚀🚀🚀RT-DETR改进创新专栏:http://t.csdnimg.cn/vuQTz 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; …

图像分类任务

本文记录 北京邮电大学 计算机学院的学习记录 什么是图像分类任务&#xff1f; 图像分类任务是计算机视觉中的核心任务&#xff0c;其目 标是根据图像信息中所反映的不同特征&#xff0c;把不同类别 的图像区分开来 图像分类任务有哪些难点呢&#xff1f; 语义鸿沟视角变化…

为什么要坚持每天做公域引流

做公域不一定等于拍视频&#xff0c;真正适合小白的引流方式其实还是做图文内容&#xff0c;比如小红书发帖&#xff0c;知乎问答&#xff0c;微信读书&#xff0c;问一问等。 长期坚持每天做公域引流有以下好处&#xff1a; 提高品牌知名度&#xff1a;每天坚持做公域流量&a…

ECMAScript2023你学习了吗?

一、ES2023 Features 【Array find from last】 从头到尾搜索数组&#xff1a;findLast() 、findLastIndex()【Hashbang Grammar】Hashbang 语法【Symbols as WeakMap keys】Symbol 作为 WeakMap 的键【Change array by copy】通过副本更改数组&#xff1a;toReversed()、toSo…

2016年五一杯数学建模C题二孩政策问题解题全过程文档及程序

2016年五一杯数学建模 C题 二孩政策问题 原题再现 多年来实施的严、紧计划生育政策对控制人口增长起到关键作用。在优生优育政策的指引下&#xff0c;我国人口质量显著提高&#xff0c;但也带来了不利影响&#xff0c;生育率偏低、男女比例失衡、人口老龄化情况严重等问题。2…

Go 基本语法

一、​​​​变量定义方法 var 定义变量 var 变量名 类型 表达式 var name string "Snail" var age int 21 var isOK bool bool 2.类型推导方式定义变量 a 在函数内部&#xff0c;可以使用更简略的: 方式声明并初始化变量**注意&#xff1a;**短变量只能用于声…

Java核心知识点整理大全20-笔记

目录 17. 设计模式 17.1.1. 设计原则 17.1.24. 解释器模式 18. 负载均衡 18.1.1.1. 四层负载均衡&#xff08;目标地址和端口交换&#xff09; 18.1.1.2. 七层负载均衡&#xff08;内容交换&#xff09; 18.1.2. 负载均衡算法/策略 18.1.2.1. 轮循均衡&#xff08;Roun…