Linux 進程通信

1.什么是進程通信?

答:兩個或多個進程實現數據層面的交互;但是因為進程的獨立性,導致進程通信的成本較高;

2.為什么要通信?

答:多進程之間由協同的需求,所以通信;以下是通信要實現的目的:

2.1.基本數據:

2.2.發送命令:一個進程控制另一個進程

2.3.多進程之間實現協同

2.4.通知

2.6.通信是有成本的:因為是要打破進程的獨立性

3.怎么通信?

3.1進程間通信的本質:必須讓不同的進程看到同一份“資源”

3.2“資源”——特定形式的內存空間;

3.3這個資源誰提供?答:一般是操作系統提供;

3.4為什么不是我們兩個進程中的一個提供呢?答:進程具有獨立性;假設是由一個進程提供,這個資源應該屬于誰?他不是共享資源,還是進程獨有,因為破環了進程的獨立性;OS是第三方空間,誰用誰申請

3.5進程訪問這個空間,進行通信,本質就是訪問操作系統;進程代表的就是用戶;“資源”從創建、使用、釋放——必須調用系統接口;

3.6操作系統提供資源,保障了進程通信,而且底層設計、接口設計、都要由操作系統獨立設計;一般操作系統,會有一個獨立的通信模塊——隸屬于文件系統——IPC通信模塊(進程間通信的意思)

3.7進程間通信是由標準的;兩套標準——system V? 和 posix

3.8基于文件級別的通信方式——管道(此時的文件,只是代稱,我可以往內存中寫啊)

思想是正確的,但是效率并不高;管道是Linux(unix)最古老的進程通信方式;

3.9管道原理(自我理解):基礎IO部分,緩沖區里的數據要寫入磁盤文件,現在不寫入磁盤,而是直接與子進程交互,把數據給子進程;并且通過引用計數原理(智能指針)控制著文件的打開和關閉,進行讀寫;(只能單向通信所以命名為管道)

3.10強烈建議如果單向通信,一定要關閉不必要的文件描述符,防止寫錯;

3.11 如果我要進行雙向通信呢——答:建兩個管道;

3.12 以上講的是父子進程,如果沒有任何關系,可以用以上講的原理進行通信嗎?答:不能,做不到;

3.13兄弟之間也可以用管道,進行通信;爺爺和孫子也可以進行通信——使用管道通信,必須得是具有血緣關系;常用于父子之間

3.14 以上所說的文件,是在緩沖區中進行的,并不是在真實的文件中交互的,所以這個管道叫做匿名管道!

4.接口

4.1open、close是磁盤級的接口,不能用他,而是專用的接口pipe(系統接口)

 int pipe(int pipefd[2]);//pipdfd[2]  輸出型參數
//pipefd[0]  只讀下標 
//pipefd[1]  只寫下標

4.2代碼實現管道

// 實現系統間通信
#include <iostream>
#include <unistd.h>
#include <string>
#include <cstdlib> //stdlib.h C++風格的頭文件寫法
#include <sys/types.h>
#include <sys/wait.h>using namespace std;#defind N 2
#define NUM 1024
void Writer(int wfd)
{string s = "hello,i am child!";pid_t self = getpid();int number = 0;char buffer[NUM];while (true){//構建字符串buffer[0] = 0; // 字符串清空;只是為了提醒閱讀代碼的人,我把這個數組當作字符串了snprintf(buffer, sizeof(buffer), "%s-%d-%d", s.c_str(), self, number);//cout<<buffer<<endl;       //發送給父進程write(wfd,buffer,strlen(buffer));sleep(1);}
}
void Reader(int rfd)
{char buffer[NUM];while(true){buffer[0]=0;ssize_t n=read(rfd,buffer,sizeof(buffer));if(n>0){buffer[n]=0; //0=='\0'cout<<"father get a message["<<getpid()<<"]#"<<buffer<<endl;}}
}
int main()
{int pipefd[N] = {0};int n = pipe(pipefd); // 0下標是讀;1下標是寫if (n < 0){perror("pipe");return 1;}// cout<<"pipefd[0]:"<<pipefd[0]<<",pipefd[1]:"<<pipefd[1]<<endl;// 子進程寫入,父進程讀pid_t id = fork();if (id < 0)return 2;if (id == 0){// 子進程close(pipefd[0]);Writer(pipefd[1]);close(pipefd[1]);exit(0);}close(pipefd[1]);Reader(pipefd[1]);pid_t rid = waitpid(id, nullptr, 0);if (rid < 0)return 3;close(pipefd[0]);return 0;
}

4.3根據以上代碼可以得到管道的本質:將上層緩沖區的數據拷貝到系統緩沖區,再將數據拷貝給上層緩沖區;

4.4進程間通信的本質:需要讓不同的進程,看到同一份資源——但是是多執行流共享的,難免會出現訪問沖突的問題;

5.管道的特征:五點

5.1具有血緣關系的進程進行進程間通信;

5.2管道只能單向通信;

5.3父子進程是會進程協同的,同步與互斥的——保護管道文件的數據安全;

5.4管道是面向字節流的;

5.5管道是基于文件的,文件的生命周期是跟隨進程的(父子進程退出,管道會被操作系統回收)

6.管道的4種情況:

6.0管道是有大小的,Linux版本2.6.11之前是4KB,之后是64KB;(為了保障傳輸數據的整體性,有序性,定義了一個pipe_buf 大小是4KB,當寫入系統緩沖區的數據小于4KB時,必須要等子進程傳輸完數據,父進程才能讀——這個工作就是讀取的原子性問題)

6.1讀寫端正常,管道如果為空,讀端就要阻塞;

6.2讀寫端正常,管道如果被寫滿,寫端就要阻塞

6.3讀端正常,寫端關閉,讀端就會讀到0,表明讀到了文件(pipe)結尾,不會被阻塞;一直在讀;

6.4讀端關閉,寫端正常,操作系統就要殺掉這個正在寫入的進程;如何干掉?答:操作系統通過信號(是幾號信號? 答:13號)干掉(操作系統是不會做低效,浪費等類似的工作的,如果做了,那就是操作系統的bug)

ulimit -a //查看系統對一些非常重要的資源的限制

7.管道的應用場景

7.1這個管道和我們以前學的知識,哪些是有關系的?

Linux shell 指令 :cat test.txt | head -10 |tail -5? 這個語句的實現,就是shell命令+進程替換+管道實現的;

7.2使用管道實現一個簡易版本的進程池;(請看下一節)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37281.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37281.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37281.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java常用對象的快速初始化

在Java中&#xff0c;有多種方式來快速初始化各種常用對象&#xff0c;如字符串數組&#xff08;String[]&#xff09;&#xff0c;集合列表&#xff08;List&#xff09;&#xff0c;映射表&#xff08;Map&#xff09;&#xff0c;以及集合&#xff08;Set&#xff09;。不同…

動態服務管理的藝術:Eureka在服務擴展與收縮中的策略

動態服務管理的藝術&#xff1a;Eureka在服務擴展與收縮中的策略 在微服務架構中&#xff0c;服務的動態擴展和收縮是實現高可用性和彈性的關鍵。Eureka&#xff0c;作為Netflix開源的服務發現框架&#xff0c;提供了一套機制來處理服務實例的動態變化。本文將深入探討Eureka如…

在操作系統中,background通常指的是運行于后臺的進程或任務

在計算機中&#xff0c;"background"一詞具有多種含義&#xff0c;以下是一些主要的解釋和相關信息&#xff1a; 計算機視覺中的背景&#xff08;Background&#xff09;&#xff1a; 在計算機視覺中&#xff0c;background指的是圖像或視頻中的背景部分&#xff0c;…

[code snippet] 生成隨機大文件

[code snippet] 生成隨機大文件 一個無聊的測試代碼&#xff0c;因為要測試大文件的網絡傳輸&#xff0c;就寫了一個隨機大文件生成腳本&#xff0c;做個備份。 基本上都是 GPT 生成的&#xff0c;哈哈。 C# 代碼 namespace ConsolePlayground;internal class BigFileGenera…

IOS17閃退問題Assertion failure in void _UIGraphicsBeginImageContextWithOptions

最近項目更新到最新版本IOS17&#xff0c;發現一個以前的頁面突然閃退了。原來是IOS17下&#xff0c;這個方法 UIGraphicsBeginImageContext(CGSize size) 已經被移除&#xff0c;原參數如果size為0的話&#xff0c;會出現閃退現象。 根據說明&#xff0c;上述方法已經被替換…

【shell腳本速成】python安裝腳本

文章目錄 案例需求應用場景解決問題腳本思路案例代碼 &#x1f308;你好呀&#xff01;我是 山頂風景獨好 &#x1f388;歡迎踏入我的博客世界&#xff0c;能與您在此邂逅&#xff0c;真是緣分使然&#xff01;&#x1f60a; &#x1f338;愿您在此停留的每一刻&#xff0c;都沐…

React 中 useEffect

React 中 useEffect 是副作用函數&#xff0c;副作用函數通常是處理外圍系統交互的邏輯。那么 useEffect 是怎處理的呢&#xff1f;React 組件都是純函數&#xff0c;需要將副作用的邏輯通過副作用函數抽離出去&#xff0c;也就是副作用函數是不影響函數組件的返回值的。例如&a…

vue中如何使用echarts和echarts-gl實現三維折線圖

一、vue中使用三維折線圖 效果圖&#xff1a; 二、使用步驟 1.引入庫 安裝echarts 在package.json文件中添加 "dependencies": {"echarts": "^5.1.2""echarts-gl": "^1.1.1",// "echarts-gl": "^2.0.8…

5G超寬,遠程診療帶來優質就醫體驗

上篇&#xff08;5G與4G的區別-CSDN博客&#xff09;講了4G與5G的區別&#xff0c;大家可以看到5G 具備高帶寬、低時延的特性&#xff0c;可以廣泛應用在各種物聯網場景下。 今天和大家簡單聊聊5G遠程診療。 遠程診療是一種利用信息通信技術為患者提供醫療服務的方式。它允許…

掌握PoE交換機的潛力:全面的以太網供電連接手冊

在數字化日益成為我們生活和工作核心的今天&#xff0c;一個穩固且效率高的網絡基礎架構對于個人和企業來說是不可或缺的。PoE&#xff08;以太網供電&#xff09;交換機作為一種創新技術&#xff0c;通過單一的網絡線纜同時傳遞數據和電源&#xff0c;對于增強網絡的性能起著關…

5. Spring IoCDI ★ ?

5. Spring IoC&DI 1. IoC & DI ??1.1 Spring 是什么&#xff1f;★ &#xff08;Spring 是包含了眾多?具?法的 IoC 容器&#xff09;1.1.1 什么是容器&#xff1f;1.1.2 什么是 IoC&#xff1f;★ &#xff08;IoC: Inversion of Control (控制反轉)&#xff09;總…

都江堰操作系統(DJYOS)和安卓操作系統(Android)的區別

- 開發團隊&#xff1a;都江堰操作系統由深圳市秦簡計算機系統有限公司開發和運營&#xff1b;而安卓由谷歌及其他公司帶領的開放手機聯盟開發。 - 開源情況&#xff1a;都江堰操作系統是開源操作系統&#xff0c;采取了類BSD許可證&#xff1b;安卓是基于Linux的開放源代碼軟…

AGI大模型的門檻是什么?怎么學

AGI&#xff08;Artificial General Intelligence&#xff0c;通用人工智能&#xff09;大模型&#xff0c;即具備類似人類智能的、能夠理解、學習、應用知識和技能并解決各種復雜問題的通用型人工智能模型&#xff0c;目前仍然是人工智能研究的前沿領域&#xff0c;具有以下門…

深度學習 --- stanford cs231學習筆記七(訓練神經網絡之梯度下降優化器)

5&#xff0c;梯度下降優化器 5&#xff0c;1 梯度下降在深度學習中的作用 在深度學習中&#xff0c;權重W的值是否合理是由損失函數L來判斷的。L越小&#xff0c;表示W的設置越happy。L越大&#xff0c;表示W的值越unhappy。 為了讓L越來越小&#xff0c;常用的方法是梯度下降…

centos7安裝zabbix6.4-mysql8

CentOS 7 安裝 Zabbix 6.4 步驟 關閉防火墻和服務 systemctl stop firewalld.service setenforce 0安裝 MySQL 配置 MySQL 源 wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm yum -y install mysql80-community-release-el7-5.noarch.rpm安裝 M…

句法分析概述

第1關&#xff1a;句法分析概述 任務描述 本關任務&#xff1a;通過對句法分析基本概念的學習&#xff0c;完成相應的選擇題。 相關知識 為了完成本關任務&#xff0c;你需要掌握&#xff1a; 句法分析的基礎概念&#xff1b; 句法分析的數據集和評測方法。 句法分析簡介…

應用及安全

目錄 一、PAM 安全認證及配置 1.1配置 su 命令的認證 1.2PAM 配置文件結構二、賬號和密碼安全管理 2.1賬號管理 2.2系統賬號清理 2.3密碼安全控制 2.4密碼重設示例 2.5參考命令三、命令歷史限制 3.1設置命令歷史記錄…

【問chatgpt】

這采用的是什么腳手架初始化的&#xff1f;這樣問詢chatgpt 從文件結構來看&#xff0c;這個項目很可能是使用 Express 框架初始化的。這些文件夾和命名約定常見于 Express 項目結構&#xff0c;特別是&#xff1a; controllers: 控制器文件夾&#xff0c;通常用于處理請求邏…

同城小商城貨到付款系統源碼小程序

&#xff1a;便捷購物新選擇 &#x1f680; 一、快速便捷&#xff0c;同城直達 在這個快節奏的時代&#xff0c;時間就是金錢。你是否曾因為等待快遞而焦慮不安&#xff1f;現在&#xff0c;有了“同城商城貨到付款小程序”&#xff0c;這一切都變得不再是問題。它專注于同城…

<商務世界>《79 微課堂 <客戶是核心:2 客戶溝通的技巧《揚長避短進行溝通》(全文原創首發)>》

1 說明 符合表示★關鍵信息▲必要信息●一般信息 2 規則 等級信息★1、無準備&#xff0c;不溝通。▲2、做最準備充分&#xff0c;準備不設上限★3、掌握自己的節奏&#xff0c;不在他人節參中被動●4、準備充分、心態平穩、揚長避短。●5、溝通就是對消息的處理。發送、接收…