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

news2024/11/24 19:40:14

《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.coloradmin.cn/o/1258567.html

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

相关文章

浅谈智能配电房电力运维平台的开发与应用

安科瑞 华楠 摘 要&#xff1a;近年来&#xff0c;我国对电能的需求不断增加&#xff0c;智能电网建设越来越多。为实现对智能配电房设备运行状态的实时监测、态势觉察和态势可视化集中显示&#xff0c;基于智能配电房传感器和配电自动化站所终端单元&#xff08;DTU&#xf…

Transformers实战——文本相似度

文章目录 一、改写文本分类1.导入相关包2.加载数据集3.划分数据集4.数据集预处理5.创建模型6.创建评估函数7.创建 TrainingArguments8.创建 Trainer9.模型训练10.模型评估11.模型预测 二、交互/单塔模式1.导入相关包2.加载数据集3.划分数据集4.数据集预处理5.创建模型&#xff…

K 最近邻算法

K 最近邻算法 简单 KNN海伦约会手写数字识别KNN 算法的优缺点 K 最近邻&#xff08;K-NearestNeighbor&#xff0c;KNN&#xff09;算法&#xff0c;是 1967 年由 Cover T 和 Hart P 提出的一种用于分类与回归的方法。 基本原理&#xff1a;存在一个带标签的数据集&#xff08;…

用二维码展示产品信息,轻松解决产品宣传难题

为了方便客户更好的了解产品&#xff0c;提升产品宣传效率&#xff0c;可以搭建产品信息二维码系统。为每一类产品生成一个二维码&#xff0c;上传文字、图片、音视频等内容&#xff0c;将二维码印刷在产品外包装、画册、样品卡或说明书上&#xff0c;用户使用微信扫码就能查看…

4G自动变焦云台球机摄像头如何解决低功耗问题?

目前也很多4G球机&#xff0c;不过对于工业的应用&#xff0c;可能还需要有针对性的球机方案&#xff1f; 比如,大家关心的功耗问题&#xff0c;在无电无网的情况下&#xff0c;偏远山区&#xff0c;对于一些油田的管控&#xff0c;输线电路可视化监控&#xff0c;天然气管道的…

怎么快速制作一本出色的电子期刊!

比起传统纸质期刊&#xff0c;电子期刊有着众多的优势&#xff0c;它打破了以往的传播形式和人们传统的时空观念&#xff0c;从而更加贴近人们的生活&#xff0c;更好地满足新时代人们对文化生活的更高要求。如何制作电子期刊呢&#xff1f; 其实很简单&#xff0c;只需要使用…

动态规划背包问题总结

背包问题分类繁多,对刚学习动态规划的新手的来说难度不小,接下来就来仔细理一理背包问题 首先我们先不管背包问题有几种分类,反正讲了也不会有什么深刻的认识,只有你真正做题遇到了,你来能感受到他大概是怎么样的 回到最初的起点,我们需要搞明白的是: 什么是背包问题? 我们…

扩散模型实战(十三):ControlNet结构以及训练过程

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xff…

Android : 获取、添加、手机联系人-ContentResolver简单应用

示例图&#xff1a; MainActivity.java package com.example.mygetdata;import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat;import android.Mani…

vue项目通过HBuilder打包成apk,实现apk自动更新下载

vue 项目通过 HBuilder 打包成 apk&#xff0c;实现 apk 自动更新下载 1、vue 项目通过 HBuilder 打包成 apk vue 项目在终端执行 npm run build 打包成 dist 文件&#xff0c;生成的 dist 文件在 项目根目录下 在 HBuilder 中 新建一个项目 默认选择 5APP 的默认模板项目…

【多属性对象“{a:1,b:2}”】与【单属性对象的数组“[{a:1},{b:2}]”】的相互转换

前端开发的某些场景&#xff08;比如用echarts开发某些可视化图表&#xff09;经常需要将【多属性对象&#xff0c;如“{a:1,b:2}”】与【单属性对象的数组&#xff0c;如“[{a:1},{b:2}]”】做相互转换&#xff0c;以下是不通过循环&#xff0c;简洁实现这种转换的方法&#x…

广州华锐互动:线上3D低碳环保主题展厅,沉浸式体验有助于培养环保意识

随着科技的飞速发展&#xff0c;环保已经成为了全球关注的焦点。为了让更多的人了解环保科技的重要性&#xff0c;许多城市都建立了线上3D低碳环保主题展厅。这些展馆通过虚拟现实技术&#xff0c;让人们身临其境地感受到环保科技的魅力&#xff0c;从而提高人们的环保意识。 线…

卡码网语言基础课 | 14. 链表的基础操作Ⅱ

题目&#xff1a; 构建一个单向链表&#xff0c;链表中包含一组整数数据&#xff0c;输出链表中的第 m 个元素&#xff08;m 从 1 开始计数&#xff09;。 要求&#xff1a; 1. 使用自定义的链表数据结构 2. 提供一个 linkedList 类来管理链表&#xff0c;包含构建链表、输出…

自动标注好用吗?基于SAM和Label Studio搭建半自动实例分割标注平台

文章目录 一、半自动标注二、缺点三、安装方法1、 python版本要求2、下载playground3、SAM安装4、SAM权重下载5、安装label-studio-ml6、启动SAM接口7、SAM启动日志8、安装并启动label-studio9、label-studio启动日志 四、半自动标注使用方法1、创建project并导入数据2、标签设…

多元系的复相平衡

多元系的复相平衡 多元系的吉布斯函数 G-{T,p,n}系统 吉布斯关系 多元系的热力学基本方程

使用Three.js创建导航立方体

什么是导航立方体? 导航立方体是一个交互式的3D控件,它允许用户通过点击和拖动立方体的各个面来改变3D视图的方向。这是一种非常直观的方式,让用户能够轻松地在3D空间中导航。 创建导航立方体 下面是一个基本的步骤,说明如何使用Three.js创建一个导航立方体: // 创建场景…

ICCV 2023 | 动态蛇形卷积(内含即插即用的代码及测试用例)

论文链接&#xff1a; https://arxiv.org/abs/2307.08388 代码链接&#xff1a; https://github.com/YaoleiQi/DSCNet 下面直接上代码&#xff0c;并且源码中也给了测试用例&#xff0c;是一个即插即用的模块 import os import torch import numpy as np from torch impor…

怎么做excel表格的二维码?文件快速做二维码的教程

Excel表格怎么做成二维码来扫码插看呢&#xff1f;Excel是工作中常用的一种文件格式&#xff0c;想要将表格内容分享给其他人查看&#xff0c;那么将表格生成二维码的方法会更加的方便快捷&#xff0c;其他人只需要扫描二维码就可以查看或者下载文件。表格excel二维码可以通过文…

Rust语言入门教程(六) - 字符串类型

在Rust中&#xff0c; 字符串类型其实是一个比较复杂的话题。在Rust的标准库中&#xff0c;至少都提供了6种字符串类型&#xff0c;我们平常使用的最多的是其中的两种。这两种类型互相之间也有所关联&#xff1a; str&#xff1a; 字符串切片String 字符串 其中&#xff0c; 字…

细说数据仓库上篇

在谈数仓之前&#xff0c;先来看下面几个问题&#xff1a; 数仓为什么要分层&#xff1f; 用空间换时间&#xff0c;通过大量的预处理来提升应用系统的用户体验&#xff08;效率&#xff09;&#xff0c;因此数据仓库会存在大量冗余的数据&#xff1b;不分层的话&#xff0c;…