Linux系统---进程间通信与管道入门

顾得泉:个人主页

个人专栏:《Linux操作系统》 《C++从入门到精通》  《LeedCode刷题》

键盘敲烂,年薪百万!


一、进程间通信

1.进程间通信的目的

     1.数据传输:一个进程需要把他的数据传给另外一个进程。

     2.资源共享:多个进程之间共享同样的资源。

     3.通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。

     4.进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

2.进程间通信发展

       最早的进程间通信方式是使用操作系统提供的共享内存和消息队列机制。共享内存允许多个进程将同一段内存映射到它们自己的地址空间,从而实现数据共享;消息队列则允许进程通过发送和接收消息来进行通信。

       随着网络技术的发展,进程间通信也逐渐向网络通信发展。网络通信使得不同计算机上的进程能够进行跨机器的通信和协作。常见的网络通信方式包括套接字(socket)、远程过程调用(RPC)和消息传递接口(MPI)等。

       近年来,随着多核处理器和分布式计算的普及,进程间通信的需求也越来越高。为了提高通信效率和方便编程,各种新的进程间通信技术应运而生。例如,管道(Pipe)和FIFO允许两个相关进程之间进行通信;信号量(Semaphore)和互斥锁(Mutex)等同步机制可以确保多个进程之间的正确协作;套接字和远程过程调用等技术允许分布在不同计算机上的进程进行通信。

3.进程间通信分类

管道

     1.匿名管道pipe

     2.命名管道

System V IPC

     1.System V 消息队列

     2.System V 共享内存

     3.System V 信号量

POSIX IPC

     1.消息列队

     2.共享内存

     3.信号量

     4.互斥量

     5.条件变量

     6.读写锁


二、管道

1.管道简介

       在Linux中,管道(pipeline)是一种机制,用于将一个命令的输出作为另一个命令的输入。通过使用管道,可以将多个命令组合在一起,以便实现更复杂的操作。

       在命令行中,使用竖线符号( | )来表示管道。

2.匿名管道

#include <unistd.h>

功能:创建一无名管道

原型

int pipe(int fd[2]);

参数

fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端

返回值:成功返回0,失败返回错误代码

实例代码:

       从键盘读取数据,写入管道,读取管道,写到屏幕

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main( void )
{int fds[2];char buf[100];int len;if ( pipe(fds) == -1 )perror("make pipe"),exit(1);// read from stdinwhile ( fgets(buf, 100, stdin) ) {len = strlen(buf);// write into pipeif ( write(fds[1], buf, len) != len ) {perror("write to pipe");break;}memset(buf, 0x00, sizeof(buf));// read from pipeif ( (len=read(fds[0], buf, 100)) == -1 ) {perror("read from pipe");break;}// write to stdoutif ( write(1, buf, len) != len ) {perror("write to stdout");break;}}
}

3.用fork来共享管道原理

       fork系统调用会在父进程中创建一个新的子进程,这个子进程与父进程几乎完全相同,包括代码段、数据段和堆栈段。这意味着子进程可以继承父进程的打开文件描述符等资源。

       在使用fork创建子进程后,父进程和子进程可以通过管道来进行通信。管道是一种特殊的文件,它能够连接一个进程的输出和另一个进程的输入。在Linux中,管道可以通过pipe系统调用来创建。

       当父进程创建管道后,它可以使用fork来创建子进程。接下来,父进程可以关闭管道的读端,子进程可以关闭管道的写端。这样,父进程就可以将数据写入管道的写端,子进程可以从管道的读端读取数据。

具体操作如下:

     1.父进程使用pipe系统调用创建一个管道。

     2.父进程使用fork系统调用创建子进程。

     3.子进程关闭管道的写端。

     4.父进程关闭管道的读端。

     5.父进程将要传输的数据写入管道的写端。

     6.子进程从管道的读端读取数据。

       父进程可以通过管道将数据传输给子进程,子进程可以通过管道接收父进程传输的数据。这样,父进程和子进程就可以进行进程间通信了。

       需要注意的是,管道的容量是有限的,如果管道被写满后继续写入数据,写入操作会被阻塞,直到有数据被读取出来为止。同样,如果管道为空时读取数据,读取操作也会被阻塞,直到有数据被写入为止。因此,在使用共享管道进行进程间通信时,需要合理控制数据的读写操作,以避免阻塞问题的发生。


三、深度理解管道

1.文件描述符角度

1.父进程创建管道

2.父进程fork出子进程

3.父进程关闭fd[0],子进程关闭fd[1]

2.内核角度-内核本质

       管道的实现机制:内核中的管道是通过一对文件描述符来实现的。一个文件描述符用于读取管道数据,另一个文件描述符用于写入管道数据。内核维护着一个缓冲区,用于存放从写入端写入的数据,并且从读取端读取的数据会从缓冲区中删除。

       管道的数据传输:管道是一种半双工的通信方式,数据只能单向流动。当写入端写入数据时,数据会被放入缓冲区中,直到被读取端读取。如果缓冲区已满,则写入操作会被阻塞,直到缓冲区有空闲空间。同样,如果缓冲区为空,则读取操作会被阻塞,直到缓冲区有数据。

       管道的进程同步:当多个进程使用管道通信时,可能会出现进程同步的问题。例如,如果写入端连续写入数据,而读取端没有及时读取,那么缓冲区可能会溢出。为了解决这个问题,内核提供了一些同步机制,例如管道的阻塞和非阻塞模式、管道的读取和写入端都关闭时的特殊情况等。

       管道的文件描述符操作:在内核中,文件描述符是一种操作系统提供给用户空间的接口。通过文件描述符的操作,可以实现对管道的读取和写入。对于读取操作,可以使用read系统调用从管道中读取数据;对于写入操作,可以使用write系统调用向管道中写入数据。


结语:关于理解Linux系统下的进程间通信与管道基础的分享到这里就结束了,没有进行展示的操作大家可以自行练习,希望本篇文章的分享会对大家的学习带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言~~~ 

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

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

相关文章

SAR教程系列7——在cadence中用Spectrum工具FFT仿真ADC的ENOB、SNR等动态性能指标

首先在仿真之前&#xff0c;你得有一个ADC。然后是思考如何仿真的问题&#xff0c;如何加激励&#xff0c;如何使用相关工具查看仿真结果。假定你有一个可以仿真的ADC&#xff0c;大致经过下列步骤可以得到ADC的相关动态性能指标。 第一步&#xff1a;在ADC后面接一个理想的DA…

idea快速找到maven中冲突的依赖,解决依赖冲突

红色实线&#xff1a;冲突&#xff0c;红色虚线&#xff1a;依赖于同一个包的多版本 选择包&#xff0c;右键Excluede&#xff0c;排除 问题原因: 一个项目中需要jar包A和jar包B,而jar包A和jar包B都需要依赖jar包C,但A需要1.2.16版本的C,B需要1.2.17版本的C,这时候就可能会产…

基于MPPT的风力机发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1风能与风力发电机模型 4.2风力机功率特性与最大功率点 4.3 MPPT 5.完整工程文件 1.课题概述 基于MPPT的风力机发电系统simulink建模与仿真。MPPT使用S函数编写实现。基于最大功率点跟踪&#xff08…

Python快速入门系列-8(Python数据分析与可视化)

第八章:Python数据分析与可视化 8.1 数据处理与清洗8.1.1 数据加载与查看8.1.2 数据清洗与处理8.1.3 数据转换与整理8.2 数据可视化工具介绍8.2.1 Matplotlib8.2.2 Seaborn8.2.3 Plotly8.3 数据挖掘与机器学习简介8.3.1 Scikit-learn8.3.2 TensorFlow总结在本章中,我们将探讨…

构建第一个ArkTS应用(FA模型)

创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。选择Application应用开发&#xff08;本文以应用开发为例&#xff0c;Atomic Servi…

权限管理系统【BUG】

1.1.简介 忙里偷闲&#xff0c;学点Java知识。越发觉得世界语言千千万&#xff0c;最核心的还是思想&#xff0c;一味死记硬背只会让人觉得很死板不灵活&#xff0c;嗯~要灵活~ 1.2.问题 permission.js:37 [Vue warn]: Error in render: "TypeError: Cannot read prope…

docker + miniconda + python 环境安装与迁移(简化版)

本文主要列出从安装dockerpython环境到迁移环境的整体步骤。windows与linux之间进行测试。 详细版可以参考&#xff1a;docker miniconda python 环境安装与迁移&#xff08;详细版&#xff09;-CSDN博客 一、docker 安装 略过&#xff0c;参见详细版or其他教程 二、dock…

Nginx反向代理和缓存

一、Nginx反向代理 1.调度和代理的区别&#xff1a; 1.调度基于内核层面&#xff0c;代理基于应用层面 2.代理必须实现一手托两家 3.调度不需要监听任何端口&#xff0c;不需要工作任何应用程序&#xff0c;代理需要工作和上游服务器一模一样的进程 4.调度没有并发上限&am…

django-haystack,具有全文搜索功能的 Python 库!

目录 前言 安装与配置 全文搜索基础 搜索引擎配置 索引配置 搜索视图与模板 过滤器与排序 自定义搜索逻辑 应用场景 1. 电子商务网站的商品搜索 2. 新闻网站的文章搜索 3. 社交网站的用户搜索 4.企业内部系统的文档搜索 总结 前言 大家好&#xff0c;今天为大家分享…

详解Qt中使用线程

详解Qt中使用线程 Qt中的线程相关知识涵盖了线程创建、管理、通信以及线程安全等方面。下面将详细讲解这些知识点&#xff0c;并提供对应的示例代码。 线程创建与管理 QThread类 Qt通过QThread类来创建和管理线程。要创建一个新的工作线程&#xff0c;通常有两种方法&#…

【项目新功能开发篇】需求分析和开发设计

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

vue 加 websocket 聊天

<template><div style="height: 100%; width: 100%; background-color: #fff"><div class="wrap"><!-- 头部 --><div class="titleBox"><imgsrc="@/assets/image/avatar.png"style="argin: 10p…

分类预测 | Matlab实现TCN-BiGRU-Mutilhead-Attention时间卷积双向门控循环单元多头注意力机制多特征分类预测/故障识别

分类预测 | Matlab实现TCN-BiGRU-Mutilhead-Attention时间卷积双向门控循环单元多头注意力机制多特征分类预测/故障识别 目录 分类预测 | Matlab实现TCN-BiGRU-Mutilhead-Attention时间卷积双向门控循环单元多头注意力机制多特征分类预测/故障识别分类效果基本介绍模型描述程序…

Android adb 常用命令

以下是一些常用的adb&#xff08;Android Debug Bridge&#xff09;命令列表&#xff1a; 连接设备&#xff1a; adb devices&#xff1a;列出已连接的 Android 设备。adb connect <设备IP地址>&#xff1a;通过TCP/IP连接到设备。adb disconnect <设备IP地址>&…

SpringBoot多级多模块聚合项目下maven打包报‘packaging‘ with value ‘jar‘ is invalid.

问题场景&#xff1a; SpringBoot多级多模块项目中部分pom文件报红&#xff0c;mvn clean时报错&#xff1a;‘packaging’ with value ‘jar’ is invalid. Aggregator projects require ‘pom’ as packaging. 项目背景 项目是一个多级多模块项目&#xff0c;简单分为&…

【系统架构设计师】- 知识点汇总(易错总结)

—————————————————————————————————— 一、函数依赖的推理规则&#xff1a; 1、自反律&#xff1a;若Y⊆X⊆U&#xff0c;则X→Y在R上成立。 2、增广律&#xff1a;若X→Y在R上成立&#xff0c;且Z⊆U&#xff0c;则XZ→YZ在R上也成立。 3、传…

Vue-Next-Admin:适配手机、平板、PC的开源后台管理模板

摘要&#xff1a;随着移动设备和PC的普及&#xff0c;为了满足不同设备的需求&#xff0c;开发一个能够自适应手机、平板和PC的后台管理系统变得至关重要。本文将介绍一个基于Vue3.x、Typescript、Vite、Element Plus等技术的开源模板库——Vue-Next-Admin&#xff0c;帮助开发…

FebHost:人工智能时代的新宠儿.AI域名

近年来,人工智能技术在各行各业迅猛发展,正在深刻改变着我们的生活。作为AI领域的专属域名,.AI域名正成为越来越多企业和个人的首选。 那么,.AI域名到底是什么呢?它是一种特殊的顶级域名(Top-Level Domain, TLD),于2013年由 安哥拉政府正式退出。与其他通用顶级域名如.com、.…

华为ensp路由器模拟ftp服务器访问

众所周知ensp的pc只有ping功能&#xff0c;ssh、telnet、ftp都无法实现&#xff0c;所以想实现需要更换为路由器 R1需要FTP到server的ftp服务 server的FTP配置就这些命令&#xff0c;主要的是路径&#xff0c;然后在网络可达的情况下就可以进行登录测试了 aaa local-user hu…

uniapp通过蓝牙传输数据 (ios)

在uni-app中&#xff0c;可以通过uni-ble&#xff08;uni-app官方提供的蓝牙插件&#xff09;来实现iOS设备上的蓝牙数据传输。 首先&#xff0c;确保已在uni-app的manifest.json文件中添加uni-ble插件的配置&#xff1a; "permission": { "scope.userLocati…