Linux-進程間通信

1.進程間通信介紹

1.1通信目的

數據傳輸:?個進程需要將它的數據發送給另?個進程

資源共享:多個進程之間共享同樣的資源。

通知事件:?個進程需要向另?個或?組進程發送消息,通知它(它們)發?了某種事件(如進 程終?時要通知?進程)。

進程控制:有些進程希望完全控制另?個進程的執?(如Debug進程),此時控制進程希望能夠 攔截另?個進程的所有陷?和異常,并能夠及時知道它的狀態改變。

1.2進程間通信發展

管道

System V進程間通信

POSIX進程間通信

1.3進程間通信分類

管道:

匿名管道pipe

命名管道

System V IPC :

System V 消息隊列

System V 共享內存

System V 信號量

POSIX IPC :

消息隊列

共享內存

信號量

互斥量

條件變量

讀寫鎖

2.管道

管道是Unix中最古?的進程間通信的形式。

我們把從?個進程連接到另?個進程的?個數據流稱為?個“管道”

3.匿名管道

3.1示例代碼

3.2用fork來共享管道原理

3.3站在?件描述符?度-深度理解管道

3.4站在內核?度-管道本質

3.5管道樣例

3.5.1測試管道讀寫

3.5.2創建進程池處理任務

登錄 - Gitee.com

3.6管道讀寫規則

當沒有數據可讀時

O_NONBLOCK disable:read調?阻塞,即進程暫停執?,?直等到有數據來到為?。

O_NONBLOCK enable:read調?返回-1,errno值為EAGAIN

當管道滿的時候

O_NONBLOCK disable:write調?阻塞,直到有進程讀?數據

O_NONBLOCK enable:調?返回-1,errno值為EAGAIN

如果所有管道寫端對應的?件描述符被關閉,則read返回0

如果所有管道讀端對應的?件描述符被關閉,則write操作會產?信號SIGPIPE,進?可能導致 write進程退出

當要寫?的數據量不?于PIPE_BUF時,linux將保證寫?的原?性。

當要寫?的數據量?于PIPE_BUF時,linux將不再保證寫?的原?性。

3.7管道特點

只能?于具有共同祖先的進程(具有親緣關系的進程)之間進?通信;通常,?個管道由?個進 程創建,然后該進程調?fork,此后?、?進程之間就可應?該管道。

管道提供流式服務

?般??,進程退出,管道釋放,所以管道的?命周期隨進程

?般??,內核會對管道操作進?同步與互斥

管道是半雙?的,數據只能向?個?向流動;需要雙?通信時,需要建?起兩個管道

3.8管道通信的4中情況

讀正常&&寫滿

寫正常&&讀空

寫關閉&&讀正常

讀關閉&&寫正常

4.命名管道

管道應?的?個限制就是只能在具有共同祖先(具有親緣關系)的進程間通信。

如果我們想在不相關的進程之間交換數據,可以使?FIFO?件來做這項?作,它經常被稱為命名 管道。

命名管道是?種特殊類型的?件

4.1創建一個命名管道

4.2匿名管道和命名管道的區別

匿名管道由pipe函數創建并打開。

命名管道由mkfifo函數創建,打開?open

IFO(命名管道)與pipe(匿名管道)之間唯?的區別在它們創建與打開的?式不同,?但這些 ?作完成之后,它們具有相同的語義。

4.3命名管道的打開原則

如果當前打開操作是為讀?打開FIFO時:

O_NONBLOCK disable:阻塞直到有相應進程為寫?打開該FIFO

O_NONBLOCK enable:?刻返回成功

如果當前打開操作是為寫?打開FIFO時:

O_NONBLOCK disable:阻塞直到有相應進程為讀?打開該FIFO

O_NONBLOCK enable:?刻返回失敗,錯誤碼為ENXIO

實例1.?命名管道實現?件拷?

讀取?件,寫?命名管道:

讀取管道,寫??標?件:

實例2.?命名管道實現server&client通信

5.system V共享內存

共享內存區是最快的IPC形式。?旦這樣的內存映射到共享它的進程的地址空間,這些進程間數據傳遞 不再涉及到內核,換句話說是進程不再通過執?進?內核的系統調?來傳遞彼此的數據

5.1共享內存示意圖

5.2共享內存數據結構

5.3共享內存函數

實例1.共享內存實現通信

測試代碼結構

實例2.借助管道實現訪問控制版的共享內存

?6.system V 消息隊列

消息隊列提供了?個從?個進程向另外?個進程發送?塊數據的?法

每個數據塊都被認為是有?個類型,接收者進程接收的數據塊可以有不同的類型值

特性??:

PC資源必須刪除,否則不會?動清除,除?重啟,所以systemVIPC資源的?命周期隨內核

7system V 信號量

信號量主要?于同步和互斥的,下?先來看看什么是同步和互斥。

7.1并發編程,概念鋪墊

多個執?流(進程),能看到的同?份公共資源:共享資源

被保護起來的資源叫做臨界資源

保護的?式常?:互斥與同步

任何時刻,只允許?個執?流訪問資源,叫做互斥

多個執?流,訪問臨界資源的時候,具有?定的順序性,叫做同步

系統中某些資源?次只允許?個進程使?,稱這樣的資源為臨界資源或互斥資源。

在進程中涉及到互斥資源的程序段叫臨界區。你寫的代碼=訪問臨界資源的代碼(臨界區)+不訪問 臨界資源的代碼(?臨界區)

所謂的對共享資源進?保護,本質是對訪問共享資源的代碼進?保護

7.2信號量

特性??:

IPC資源必須刪除,否則不會?動清除,除?重啟,所以systemVIPC資源的?命周期隨內核

理解??:

信號量是?個計數器

作???:

保護臨界區

本質??:

信號量本質是對資源的預訂機制

操作??:

申請資源,計數器--,P操作

釋放資源,計數器++,V操作

8內核是如何組織管理IPC資源的

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

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

相關文章

精益數據分析(69/126):最小可行化產品(MVP)的設計、驗證與數據驅動迭代

精益數據分析(69/126):最小可行化產品(MVP)的設計、驗證與數據驅動迭代 在創業旅程中,從需求洞察到產品落地的關鍵一躍是打造最小可行化產品(MVP)。今天,我們結合《精益…

從JavaScript快速上手Python:關鍵差異與核心技巧

引言 如果你是JavaScript開發者,可能會對Python的簡潔語法和豐富的生態感興趣。但兩種語言的設計哲學和實現細節存在顯著差異。本文將通過對比JS與Python的核心概念,幫助你快速過渡,避免“踩坑”。 一、語法差異:告別大括號&#…

TransmittableThreadLocal實現上下文傳遞-筆記

1.TransmittableThreadLocal簡介 com.alibaba.ttl.TransmittableThreadLocal(簡稱 TTL)是阿里巴巴開源的一個工具類,旨在解決 ThreadLocal 在線程池中無法傳遞上下文變量 的問題。它是對 InheritableThreadLocal 的增強,尤其適用…

TDengine 安全部署配置建議

背景 TDengine 的分布式、多組件特性導致 TDengine 的安全配置是生產系統中比較關注的問題。本文檔旨在對 TDengine 各組件及在不同部署方式下的安全問題進行說明,并提供部署和配置建議,為用戶的數據安全提供支持。 安全配置涉及組件 TDengine 包含多…

在Cursor中啟用WebStorm/IntelliJ風格快捷鍵

在Cursor中啟用WebStorm/IntelliJ風格快捷鍵 方法一:使用預置快捷鍵方案 打開快捷鍵設置 Windows/Linux: Ctrl K → Ctrl SmacOS: ? K → ? S 搜索預設方案 在搜索框中輸入keyboard shortcuts,選擇Preferences: Open Keyboard Shortcuts (JSON) …

python打卡day30@浙大疏錦行

知識點回顧: 導入官方庫的三種手段導入自定義庫/模塊的方式導入庫/模塊的核心邏輯:找到根目錄(python解釋器的目錄和終端的目錄不一致) 作業:自己新建幾個不同路徑文件嘗試下如何導入 具體操作步驟: 在桌面…

【kafka】基本命令

創建 Kafka Topic 的命令 以下是創建 Kafka Topic 的幾種常用方法&#xff1a; 1. 使用 kafka-topics.sh 基礎命令&#xff08;Kafka 自帶工具&#xff09; bin/kafka-topics.sh --create \--bootstrap-server <broker地址:端口> \--topic <topic名稱> \--parti…

編程速遞:適用于 Delphi 12.3 的 FMX Linux 現已推出

Embarcadero非常高興地宣布&#xff0c;用于使用Delphi構建Linux客戶端應用程序的FMX Linux UI庫再次在RAD Studio 12.3版本以及RAD Studio 12.2版本中提供支持&#xff0c;同時也適用于更早的版本。 作為RAD Studio的一個附加庫&#xff0c;FMX Linux為開發面向Linux的圖形用…

通過實例講解螺旋模型

目錄 一、螺旋模型的核心概念 二、螺旋模型在電子商城系統開發中的應用示例 第 1 次螺旋:項目啟動與風險初探

vue3 vite 路由

如路由是這種格式 http://localhost:7058/admin/product/brand路由配置如下 import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vue import NProgress from nprogress; import nprogress/nprogress.css; import {errorRour…

【Redis】Hash 存儲相比 String 存儲的優勢

在 Redis 中&#xff0c;Hash 存儲相比 String 存儲具有以下 優勢&#xff0c;特別適用于某些特定場景&#xff1a; ? 1. 更節省內存&#xff08;尤其適合存儲對象&#xff09; Hash 內部使用壓縮列表&#xff08;ziplist&#xff09;或哈希表實現&#xff0c;在數據量較小時…

CSS詳解:特性、選擇器與優先級

CSS詳解&#xff1a;特性、選擇器與優先級 目錄 CSS詳解&#xff1a;特性、選擇器與優先級一、CSS的核心特性1. 層疊性&#xff08;Cascading&#xff09;2. 繼承性&#xff08;Inheritance&#xff09;3. 優先級&#xff08;Specificity&#xff09;4. 響應式設計5. 動畫與過渡…

《算法導論(第4版)》閱讀筆記:p86-p90

《算法導論(第4版)》學習第 19 天&#xff0c;p83-p85 總結&#xff0c;總計 3 頁。 一、技術總結 無。 二、英語總結(生詞&#xff1a;2) 1. inkling (1)inkling: inclen(“utter in an undertone&#xff0c;低聲說話”) c. a hint(提示)&#xff1b;a slight knowledg…

nginx概念及使用

一、Nginx 核心概念 Nginx&#xff08;發音為 "engine-x"&#xff09;是一個高性能、開源的 Web 服務器和反向代理服務器&#xff0c;由俄羅斯工程師伊戈爾?賽索耶夫&#xff08;Igor Sysoev&#xff09;于 2004 年開發&#xff0c;最初用于解決當時高并發場景下 Ap…

2025藍橋杯JAVA編程題練習Day8

1. 路徑 題目描述 小藍學習了最短路徑之后特別高興&#xff0c;他定義了一個特別的圖&#xff0c;希望找到圖 中的最短路徑。 小藍的圖由 2021 個結點組成&#xff0c;依次編號 1 至 2021。 對于兩個不同的結點 a, b&#xff0c;如果 a 和 b 的差的絕對值大于 21&#xff0…

【趙渝強老師】Memcached的路由算法

Memcached支持兩種不同方式的客戶端路由算法&#xff0c;即&#xff1a;求余數Hash算法和一致性Hash算法。下面分別進行介紹。 一、 求余數的路由算法 求余數Hash算法的客戶端路由是對插入數據的鍵進行求余數&#xff0c;根據余數來決定存儲到哪個Memcached實例。 視頻講解如…

NLP學習路線圖(一): 線性代數(矩陣運算、特征值分解等)

引言&#xff1a;語言與矩陣的奇妙邂逅 在自然語言處理&#xff08;NLP&#xff09;的魔法世界里&#xff0c;每個詞語都像被施了變形術的精靈&#xff0c;在數學的殿堂中翩翩起舞。當我們用"king - man woman queen"這樣的向量魔法破解語義密碼時&#xff0c;線性…

BUUCTF PWN刷題筆記(持續更新!!)

ciscn_2019_c_1 64位&#xff0c;沒有開啟保護。點進去沒發現明顯的漏洞函數&#xff0c;考慮泄露libc基地址的rop構造。先看看有多少gadget 估計也夠用了。puts函數只接受一個參數&#xff0c;觀看匯編看看用的哪個寄存器傳輸的參數。 用的是edi。但是我們怎么找到so的版本呢…

Java EE初階——線程安全

1. 線程的狀態 1. 線程狀態分類&#xff08;Thread.State 枚舉&#xff09; Java 定義了 6 種線程狀態&#xff0c;這些狀態均由 java.lang.Thread.State 枚舉表示&#xff1a; NEW&#xff08;新建&#xff09; 線程對象已創建&#xff0c;但尚未調用 start() 方法。此時線程…

Vue 3.0中響應式依賴和更新

響應式依賴和更新是Vue 3.0中最重要的機制&#xff0c;其核心代碼如下&#xff0c;本文將結合代碼對這個設計機制作出一些解釋。 // 全局依賴存儲&#xff1a;WeakMap<target, Map<key, Set<effect>>> const targetMap new WeakMap();// 當前活動的副作用函…