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

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

相关文章

路由器拨号失败解决方法

目录 一、遇到问题 二、测试 三、解决方法 &#xff08;一&#xff09;路由器先单插wan口设置 &#xff08;二&#xff09;mac地址替换 &#xff08;三&#xff09;更改路由器DNS 一、遇到问题 1 .在光猫使用桥接模式&#xff0c;由路由器进行拨号的时候&#xff0c;出现…

IP广播网络音频解码播放终端SV-7101SIP-7101 SIP播放解码器

IP广播网络音频解码播放终端SV-7101SIP-7101 SIP播放解码器 一、描述 SIP-7101是我司的一款壁挂式SIP网络播放终端&#xff0c;具有10/100M以太网接口&#xff0c;配置一路继电器输出和一路线路输出&#xff0c;可将内部音源输出到外接功放&#xff0c;可实现广播播放功能。S…

【LeetCode热题100】39. 组合总和(回溯)

一.题目要求 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复…

Nginx三大常用功能“反向代理,负载均衡,动静分离”

注意&#xff1a;以下案例在Windows系统计算机作为宿主机&#xff0c;Linux CentOS 作为虚拟机的环境中实现 一&#xff0c;Nginx配置实例-反向代理 1.反向代理 案例一 实现效果&#xff1a;使用nginx反向代理&#xff0c;访问 www.123.com 直接跳转到127.0.0.1:8080 准备工…

AI提速 OpenAI 新模型GPT-5今年上线?

这两天&#xff0c;有关OpenAI新模型 GPT-5的消息又多了起来。有知情人士称&#xff0c;OpenAI将在今年年中的某个时候发布GPT-5&#xff0c;很可能是在今年夏天期间。OpenAI CEO 萨姆奥特曼在一次播客采访中透露“GPT-5的智能水平得到提升”。 有趣的是&#xff0c;播客的主理…

C#常见Winform窗体效果

目录 1&#xff0c;窗体闪烁。 2&#xff0c;透明非矩形的窗体。 3&#xff0c;窗口显示&#xff0c;退出呈现平滑效果。 4&#xff0c;窗体不在任务栏中显示&#xff1a; 1&#xff0c;窗体闪烁。 /// <summary>/// 窗体闪烁/// </summary>/// <param na…

Android 窗口那些事儿

目录 1. &#x1f4c2; 前言 你&#xff0c;是否有过这些疑问&#xff1f; 2. &#x1f531; Window 2.1 认识 Window 的几个阶段 1&#xff09;阶段一&#xff1a;Window 约等于 Activity 2&#xff09;阶段二&#xff1a;Window 约等于 View 3&#xff09;阶段三&…

探索设计模式的魅力:AI大模型如何赋能C/S模式,开创服务新纪元

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 AI大模型如何赋能C/S模式&#xff0c;开创服务新纪元 数字化飞速发展的时代&#xff0c;AI大模型…

CentOS7安装Flink1.17伪分布式

前提条件 拥有1台CentOS7 CentOS7安装好jdk&#xff0c;官方文档要求java 11&#xff0c;使用java 8也可以。可参考 CentOS7安装jdk8 下载安装包 下载安装包 [hadoopnode1 ~]$ cd installfile/ [hadoopnode1 installfile]$ wget https://archive.apache.org/dist/flink/flin…

vue快速入门(一)vue的导入方法

注释很详细&#xff0c;直接上代码 新增内容 下载js代码导入实例数据绑定显示 源码 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

用c++实现旋转的万花筒、整数划分

4.3.2 旋转的万花筒 【问题】 万花简的初始形状如图4-4(a)所示&#xff0c;其中的圆圈代表万花简的闪烁点&#xff0c;每旋转一次万花简形状就演变一次&#xff0c;演变的规则是在末端再生出同样的形状&#xff0c;如图4-4(b)和图4-4(c)所示&#xff0c;求第n次旋转后有多少个…

【热门话题】WebKit架构简介

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 WebKit架构简介一、引言二、WebKit概览1. 起源与发展2. 模块化设计 三、WebCore…