Linux(15)——進程間通信

目錄

一、進程間通信的介紹

??進程間通信的目的

??進程間通信的本質?

進程間通信的分類

??管道

??System V IPC

??POSIX IPC

二、管道?

🧠什么是管道

??匿名管道

📝匿名管道的原理

📝pipe函數

📝匿名管道的使用步驟?

?編輯📝管道讀寫的規則?

📝管道的特點?


一、進程間通信的介紹

??進程間通信的目的

  • 數據傳輸:一個進程需要將它的數據發送給另一個進程
  • 資源共享:多個進程之間共享同樣的資源。
  • 通知事件:一個進程需要向另一個或一組進程發送消息,通知它(它們)發生了某種事件(如進程終止時要通知父進程)。
  • 進程控制:有些進程希望完全控制另一個進程的執行(如Debug進程),此時控制進程希望能夠攔截另一個進程的所有陷入和異常,并能夠及時知道它的狀態改變。

??進程間通信的本質?

進程間通信的本質就是讓不同的進程看到同一份資源

這里要解釋一下了,由于進程具有獨立性,所以想要直接實現不同進程間的相互通信還是非常困難的。

這里我們就引入了第三方資源來作為不同進程之間通信的橋梁,也就是說這些進程可以通過向這么個第三方資源進行寫入和讀取來進行通信,示意圖如下:

通過上面的方式,我們就實現的不同進程看到了同一份資源,所以說進程間通信的本質就是讓不同的進程看到了同一份資源。

進程間通信的分類

??管道

  • 匿名管道
  • 命名管道

??System V IPC

  • System V 消息隊列
  • System V 共享內存
  • System V 信號量

??POSIX IPC

  • 消息隊列
  • 共享內存
  • 信號量
  • 互斥量
  • 條件變量
  • 讀寫鎖

二、管道?

🧠什么是管道

管道是Unix中最古老的進程間通信的形式,我們把從一個進程連接到另一個進程的一個數據流稱為一個“管道”。

我們之前在談Linux的命令的時候也提及了管道這一概念:

例如,這個查看當前服務器有多少用戶登錄的命令

我們發現這個命令是由who命令和wc命令組成的,這個命令運行起來之后就變成了兩個進程了,who進程把執行得到的結果通過標準輸出寫入到了管道之中,wc進程通過標準輸入從管道中讀取數據,處理完之后再把結果通過標準輸出給到用戶。

注意:who顯示的是相關信息,wc -l命令是用來統計行數的。

??匿名管道

📝匿名管道的原理

匿名管道用于進程間的通信,且僅限于父子進程之間的通信。

我們之前也說了,進程間通信的本質就是讓不同的進程看到了同一份資源,使用匿名管道實現通信的原理就是讓父子進程看了同一份被打開的文件資源,然后父子進程就可以對同一份資源進行讀寫操作,從而實現了進程間的通信。

敲黑板:

這里需要注意的是這里打開的文件是由操作系統來進行管理的,父子進程進行讀寫時并不會進行寫時拷貝。

📝pipe函數

我們可以使用pipe函數來創建匿名管道

int pipe(int pipefd[2]);

參數說明:輸入的參數實際上是輸出型的參數,數組中的兩個元素分別指向讀端和寫端。‘

  • pipefd[0]:管道讀端的文件描述符
  • pipefd[1]:管道寫端的文件描述符?

如果創建失敗則返回-1,成功創建則返回0。

📝匿名管道的使用步驟?

我們在使用管道通信的時候,既要使用fork函數來創建子進程,也要使用pipe函數來創建管道。

第一步:父進程創建管道

第二步:父進程創建子進程

第三步:父端關閉寫,子端關閉讀

敲黑板:

這里的通信只能是單向的,也就是我們說的半雙工,在代碼中的反應就是管道只開一個讀端和寫端。

我們這里可以將上面的三個步驟再細化一下:

第一步:父進程創建管道

第二步:父進程創建子進程

第三步:父進程關閉寫端,子進程關閉讀端?

我們來寫個代碼演示一下:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>int main() {int fd[2] = {0}; // 作為pipe函數的參數來進行傳遞if(pipe(fd) < 0) {perror("pipe");exit(1);}pid_t id = fork();if(id == 0) // 子進程{close(fd[0]); // 關閉了讀端const char* message = "Hello my father, I am child...";int count = 10;while(count--) {write(fd[1], message, strlen(message)); // 字節流的寫入數據sleep(1);}close(fd[1]);exit(0);}// 父進程close(fd[1]); // 關閉了寫端char buffer[64];while(1) {ssize_t s = read(fd[0], buffer, sizeof(buffer)); // 由于休眠時間的存在,就會讀完整if(s > 0) {buffer[s] = '\0';printf("child send to father: %s\n", buffer);}else if (s == 0) {printf("the end\n");break;}else {printf("read error\n");break;}}close(fd[0]);waitpid(id, NULL, 0);return 0;
}

📝管道讀寫的規則?

pipe2函數的操作和pipe函數類似,具體的函數原型如下:

int pipe2(int pipefd[2], int flags);

pipe函數的第二個參數用來設置選項可以設置為O_NONBLOCK ,也就是非阻塞:

  1. 默認不傳參數時,read在沒有數據會一直等待數據的到來,write在數據數據寫滿的時候會等待數據被讀走。
  2. 在加了O_NONBLOCK 參數的時候,read在沒有數據的時候會返回-1,并把erron的值設置為EAGIN,write在數據寫滿的時候也會返回-1,并把erron的值設置為EAGIN。
  • 如果所有管道寫端對應的文件描述符被關閉,則read返回0
  • 如果所有管道讀端對應的文件描述符被關閉,則write操作會產生信號SIGPIPE,進而可能導致write進程退出
  • 當要寫入的數據量不大于PIPE_BUF時,Linux將保證寫入的原子性。
  • 當要寫入的數據量大于PIPE_BUF時,Linux將不再保證寫入的原子性。?

📝管道的特點?

第一點:管道內自帶了同步和互斥機制

首先我們要知道什么是同步和互斥:

同步:兩個或者是兩個以上的進程在運行時要按照之前約定好的順序依次執行,可以類比到做菜的場景,我們要先切菜洗菜才能去炒,要有一個先后的順序才行。

互斥:防止多個進程同時操作了同一個資源,可以類比到打印的場景,A和B都要使用打印機打印,但是我們不能同時發送內容到打印機,否則就是打印出來的結果出錯。

我們仔細思考會發現兩者其實是類似的,同步是一種更加復雜的互斥,而互斥則是一種特殊的同步,對于我們的管道而言,互斥就是兩個進程不可以同時對管道進行操作,他們會相互排斥,而同步也說的是不能對管道進行操作,但這里的要求是必須要是按照一定的次序來對管道進行操作的。

第二點:管道的生命周期隨進程

管道的本質就是通過文件來進行通信的,也就是說管道是依賴于文件系統的,那么當所有的文件都退出了,文件也就被釋放掉了,所一說管道的生命周期是隨進程的。

第三點:管道提供的是流式服務

對于進程A寫入管道的數據,進程B每次都可以從管道中任意讀取數據,這種方式被稱之為流式服務,與之對應的就是數據報服務,也就是后面我們會講的字節流和數據包。

  • 流式服務:數據沒有明確的分割,也就是會粘連在一起。
  • 數據報服務:數據有了明確的分割了,數據是一份一份的。

第四點:管道是半雙工通信

在數據通信中,數據在線路上的傳送方式有以下這幾種:

1、單工通信:數據的傳輸是單向的。通信雙方中,一方是發送端,一方是接受數據端。

2、半雙工通信:半雙工是指既可以從從兩個反向上面通信,但是不可以同時通信。

3、全雙工通信:全雙工就是兩個反向上可以同時通信,也就是加強版的半雙工,雙倍的單雙工。

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

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

相關文章

【Flutter】雙路視頻播放方案

最近在做雙路視頻播放&#xff0c;就是在一個頁面播放兩個視頻。我遇到的問題就是音頻焦點沖突問題&#xff0c;在下面說明。什么是雙路視頻播放&#xff08;來自AI&#xff09;雙路視頻播放&#xff08;Dual-Video Playback&#xff09;&#xff0c;從字面上理解&#xff0c;就…

筆試——Day25

文章目錄第一題題目思路代碼第二題題目&#xff1a;思路代碼第三題題目&#xff1a;思路代碼第一題 題目 笨小猴 思路 模擬 統計每個字符出現的次數&#xff0c;用最大減最小&#xff0c;判斷是不是質數&#xff1b; 質數的判斷使用試除法&#xff1b; 代碼 第二題 題目&…

【C#學習Day15筆記】拆箱裝箱、 Equals與== 、文件讀取IO

前言在C#第15天的學習中&#xff0c;我深入探索了類型轉換機制、對象比較原理和文件操作技術三大核心主題。這些知識是構建高效、健壯程序的關鍵基礎。本文完整保留我的課堂實踐代碼和命名體系&#xff0c;通過結構化梳理幫助大家掌握這些核心概念。所有代碼示例均來自我的實際…

發電類電力業務許可證申請條件

基本條件&#xff1a;法人資格&#xff1a;申請人必須是依法注冊的企業法人。 財務能力&#xff1a;應具有與所申請從事的電力業務相適應的財務能力。 專業人員要求&#xff1a;生產運行負責人、技術負責人、安全負責人和財務負責人需具備至少3年以上與申請從事的電力業務相關的…

JavaScript 高效入門指南:從基礎到實戰(VSCode 版)

廢話不多說&#xff0c;直接上干貨&#x1f600; 一、先搞定工具&#xff1a;VSCode 配置成「JS 開發神器」 工欲善其事&#xff0c;必先利其器。用 VSCode 寫 JavaScript&#xff0c;這幾個配置能讓你效率翻倍&#xff1a; 1. 必裝插件&#xff08;直接在 VSCode 插件商店搜…

《人形機器人的覺醒:技術革命與碳基未來》——類人關節設計:柔性驅動革命之液壓人工肌肉

目錄&#xff1a;一、人工肌肉的種類及人形機器人適用情況二、人形機器人用人工肌肉科研機構及其最新成果進展三、液壓人工肌肉種類及工作機制四、液壓人工肌肉適用人形機器人的性能要求和局限性五、液壓人工肌肉材料技術進展及其限制與突破六、波士頓動力Spot的液壓靜液傳動系…

26數據結構-順序表

&#x1f4cc;有序順序表的合并 #define MAX_SIZE 20 struct SeqList {int data[MAX_SIZE];int length; }; void mergeArray(SeqList &L1,SeqList &L2,SeqList &L) {int i0,j 0;while(i<L1.length && j<L2.length){if(L1.data[i]<L2.data[j])L.da…

25電賽e題 控制激光開關電路

e題明確說了禁止使用繼電器控制&#xff0c;所以需要自己搭建一個mos管控制電路這里使用mos管來驅動GPIO → 電阻(220Ω) → MOSFET柵極(如IRF520N)MOSFET漏極接激光器正極MOSFET源極接地激光器負極直接接電源連接方式如下這里r36為柵極電阻&#xff0c;需要跟你們使用的mos配合…

ubuntu apt源報錯?

報錯原因&#xff1a;一、網絡連接方面1.網絡不通暢&#xff08;常見&#xff09;簡單來說就是你的虛擬機連不上網&#xff0c;這時候你應該檢查自己的ip 是不是dhcp自動獲取的&#xff0c;或者你的網絡配置是否有誤。2.DNS 解析故障&#xff1a;DNS 服務器配置錯誤或 DNS 服務…

Scene as Occupancy

OccNet https://github.com/OpenDriveLab/OccNet Scene as Occupancy 提出了一種新的場景表示方法&#xff0c; 利用環視攝像頭&#xff0c;采用級聯和時序體素編碼的方式來重建三維Occ場景。Method 1&#xff09;提出的OCCNet首先重建占據描述符&#xff0c;目標是為支持下游任…

Linux基礎復習:字符輸入與輸出

該文僅針對自身對Linux基礎知識不足的地方進行補充擴展&#xff0c;便于鞏固。終端的輸入和輸出由字符設備管理。1、查看當前字符設備# 查看當前bash進程 [rootopenEuler-1 ~]# psPID TTY TIME CMD9662 pts/1 00:00:00 bash9938 pts/1 00:00:00 ps# 該目錄存放了…

【初識數據結構】CS61B中的基數排序

本教程介紹 CS61B 中的基數排序&#xff0c;這是一種可以在某些情況下甚至超越歸并排序、快速排序的特殊的排序方法&#xff0c;但是犧牲了內存空間計數排序 連續編號情形 我們需要對一個編號從 0 到 11 的表進行排序實際上我們可以拿出另一張同樣大小的空白表&#xff0c;在遍…

ReAct模式深度解析:構建具備推理能力的AI智能體架構

本文深入剖析ReAct(Reasoning+Acting)架構設計模式,揭示如何通過推理與行動循環構建具備自主決策能力的AI智能體,并展示其在復雜問題求解中的革命性突破。 引言:從工具調用到自主決策的進化 傳統AI系統面臨的核心瓶頸: #mermaid-svg-orlnKyviyW86xIJZ {font-family:&quo…

Corrosion2靶機攻略

第一步搭建環境 靶機下載地址&#xff1a;https://download.vulnhub.com/corrosion/Corrosion2.ova 下載完成后直接右擊用VM打開&#xff0c;重試一下就可以了 右擊虛擬機設置將網絡連接改成nat模式 第二步信息收集 查看一下靶機的網段&#xff0c;左上角編輯&#xff0c;虛…

SSL 剝離漏洞

一、SSL/TLS 協議基礎?1.1、SSL/TLS 協議的核心功能?SSL/TLS 協議的核心功能主要包括三個方面&#xff1a;加密、認證和完整性校驗&#xff0c;這三大功能共同構建了網絡通信的安全屏障。?&#xff08;一&#xff09;加密?加密是 SSL/TLS 協議最基本的功能。它通過使用對稱…

c++-reverse_iterator

C反向迭代器 反向迭代器是C標準庫提供的一種適配器&#xff0c;它允許我們以相反的順序遍歷容器&#xff0c;反向迭代器是正向迭代器的封裝。 迭代器可以分為兩類&#xff1a;方向性質&#xff1a;單向迭代器&#xff08;Forward Iterator&#xff09;雙向迭代器&#xff08;Bi…

linux內核驅動:電流/電壓/功率監控模塊INA226調試

目錄背景一、芯片介紹二、手冊三、內核驅動配置3.1 設備樹配置3.2 修改內核配置文件3.3 編譯四、內核驅動分析1、初始化流程2、屬性文件/解釋五、調試和計算背景 最近調試了一款德州儀器的帶有I2C控制接口的可以實現電壓、電流、功率監測&#xff0c;并可以進行報警設置的芯片I…

ACL 2024 大模型方向優秀論文:洞察NLP前沿?關鍵突破

關注gongzhonghao【計算機sci論文精選】近年來&#xff0c;以Transformer架構為核心的大語言模型重塑了自然語言處理領域的技術范式。當前ACL相關研究呈現多維度深化態勢&#xff0c;從開源社區推動輕量化架構與低成本訓練技術革新&#xff0c;到學術界探索檢索增強等機制突破長…

樂創E20H1型IO從站與Ethercat轉Profinet網關轉換器的配置應用案例

本案例聚焦于西門子 1200PLC 與 E20H1 - T01 IO 從站的連接。在正常運行過程中&#xff0c;E20H1 - T01 IO 從站需支持 EtherCAT 協議&#xff0c;作為 EtherCAT 從站&#xff1b;而監控系統所采用的西門子 S7 - 1200 系列 PLC 則支持 PROFINET 協議。由于協議的不一致性&#…

【2】專業自定義圖表創建及應用方法

一、專業自定義圖表創建及應用方法1&#xff09;不是圖表的圖表制作方法例題1:迷你圖表制作方法&#xfeff;定義&#xff1a;指依靠Excel基本制圖功能之外的其他功能&#xff08;如公式、條件格式、迷你圖等&#xff09;創建的數據可視化圖表特點&#xff1a;引用數據少且占用…