進程通信——管道

什么是進程通信?

進程通信是實現進程間傳遞數據信息的機制。要實現數據信息傳遞就要進程間共享資源——內存空間。那么是哪塊內存空間呢?進程間是相互獨立的,一個進程不可能訪問其他進程的內存空間,那么這塊空間只能由操作系統提供。進程通信的方式有多種,管道就是一種。

管道是一種最簡單的通信機制,管道分為匿名管道和命名管道。匿名管道通常用于父子進程之間。命名管道可實現任意兩個進程通信。

匿名管道

原理

父進程打開管道文件流(讀寫兩個流),分配描述符到文件描述符表。兩個新的文件描述符分別指向管道的讀端和寫端。父進程創建子進程時,子進程的文件描述符表和父進程指向相同。父子進程指向的文件流都是共享的。

父子進程通信時,如果子進程寫,父進程讀,子進程關閉pipe_r,父進程關閉pipe_w;如果子進程讀,父進程寫,子進程關閉pipe_w,父進程關閉pipe_r。

使用樣例

pipefd是一個輸出型參數,pipefd[0] 表示的是讀端的文件描述符,pipefd[1]表示的是寫端文件描述符

創建管道->創建子進程->子進程關閉讀端,寫;父進程關閉寫端,讀->父進程等待子進程?

#include <iostream>
#include <unistd.h>
#include <cstdlib>
#include <sys/types.h>
#include <sys/wait.h>using namespace std;
void Write(int fd)
{char buffer[1024] = {0};pid_t id = getpid();int n = 0;string s = "I am child";while(1){snprintf(buffer,sizeof(buffer),"%s-%d-%d",s.c_str(),id,n);n++;write(fd,buffer,sizeof(buffer));sleep(1);if(n == 5) break;}
}void Read(int fd)
{char buffer[1024] = {0};while(1){ssize_t s = read(fd,buffer,sizeof(buffer));if(s > 0){cout << buffer << endl;}else if(s == 0){cout << "read ending" << endl;break;}else{cout << "read fail" << endl;}}
}int main()
{int pipefd[2] = {0};pipe(pipefd);pid_t id = fork();if(id < 0) return -1;if(id == 0){//childclose(pipefd[0]);//關閉讀端Write(pipefd[1]);//close(pipefd[1]);exit(0);}//fatherclose(pipefd[1]);//關閉寫端Read(pipefd[0]);pid_t ret = waitpid(id,nullptr,0);if(ret==id) cout << "wait success" << endl;else cout << "wait fail" << endl;//close(pipefd[0]);return 0;
}

命名管道

命名管道原理和匿名管道一樣,區別就是命名管道會創建一個管道文件,兩個進程分別對文件讀寫就可以了

使用樣例

創建管道文件

?

銷毀管道文件

?

?

//communicate.hpp 創建銷毀管道進行封裝
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>class Init
{
public:Init(){int n = mkfifo("./myfifo", 0777);if (n == -1){perror("fifo:");exit(-1);}}~Init(){int n = unlink("./myfifo");if(n == -1){perror("unlink:");exit(-1);}}
};//sever.cpp 服務器負責維護管道,讀客戶端數據
#include "communicate.hpp"
using namespace std;
int main()
{// 創建管道Init init;// 打開管道int fd = open("./myfifo", O_RDONLY);if (fd == -1){cout << strerror(errno) << endl;return -1;}// 開始通信while (1){char buffer[1024] = {0};ssize_t ret = read(fd, buffer, sizeof(buffer));if (ret > 0){cout << "sever get inf:" << buffer << endl;}else if (ret == 0){cout << "client quit, sever quit too" << endl;break;}elsebreak;}// 結束通信close(fd);
}//client.cpp 客戶端負責向服務器寫數據
#include "communicate.hpp"using namespace std;int main()
{//打開管道int fd = open("./myfifo", O_WRONLY);if(fd < 0){cout << strerror(errno) << endl;return -1;}//進行通信while(1){string ord;cout << "Input:";getline(cin, ord);write(fd, ord.c_str(), ord.size());}close(fd);return 0;
}

管道特征

  • 只有具有血緣關系的進程可以匿名管道通信

因為只有血緣關系的進程的可以指向同一個匿名管道,達成資源(內存空間)共享,這是通信的前提

  • 管道只能單向通信
  • 通信的進程會進行協同,同步與互斥,為了保證管道文件數據的安全

例如上面的樣例:寫端每寫一次都會等待1s,寫端沒有寫完時,讀端會等待進行協同

  • 管道是面向字節流的

管道以字節為單位傳輸數據,而不是以消息或記錄為單位。這意味著數據在傳輸過程中沒有特定的結構或邊界,發送方可以連續寫入任意數量的字節,接收方則按照字節順序讀取數據。

  • 管道是基于文件的,文件的生命周期是隨進程的

管道會隨著進程結束而關閉,例如基礎IO流并不需要用戶手動關閉。在上面的例子中,子進程是寫端,沒有close(pipdf[1])也不會有錯誤,同樣的父進程是讀端,沒有close(pipdf[0])不會有錯誤,因為進程結束這個管道流會自動關閉。

管道的4種情況

  1. 讀寫端正常,管道為空,讀端就要阻塞
  2. 讀寫端正常,管道為滿,寫端就要阻塞
  3. 寫端關閉,讀端正常,讀端讀到0,表明讀到了管道文件的結尾
  4. 讀端關閉,寫端正常,寫端會被異常終止

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

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

相關文章

什么是RPA自動化辦公?

RPA自動化辦公&#xff1a;提升效率的利器 如今&#xff0c;自動化辦公已成為提升效率、減少錯誤、節省成本的關鍵手段。RPA&#xff08;機器人流程自動化&#xff0c;Robotic Process Automation&#xff09;作為其中的重要組成部分&#xff0c;正受到越來越多企業的青睞。那…

【全開源】簡單商城系統源碼(PC/UniAPP)

提供PC版本、UniAPP版本(高級授權)、支持多規格商品、優惠券、積分兌換、快遞鳥電子面單、支持移動端樣式、統計報表等 提供全部前后臺無加密源代碼、數據庫離線部署。 構建您的在線商店的基石 一、引言&#xff1a;為什么選擇簡單商城系統源碼&#xff1f; 在數字化時代&am…

【Spring Cloud Alibaba】初識Spring Cloud Alibaba

目錄 回顧主流的微服務框架Spring Cloud 版本簡介Spring Cloud以往的版本發布順序排列如下&#xff1a; 由停更引發的"升級慘案"哪些Netflix組件被移除了&#xff1f; 替換方案服務注冊中心&#xff1a;服務調用&#xff1a;負載均衡&#xff1a;服務降級&#xff1a…

Python—面向對象小解(6)-閉包、裝飾器

一、閉包 在Python中&#xff0c;閉包&#xff08;closure&#xff09;是一個函數對象&#xff0c;即使在其詞法作用域外被調用&#xff0c;它仍然能訪問該作用域內的變量。閉包通過“捕獲”周圍作用域的變量&#xff0c;保持這些變量的狀態&#xff0c;即使在外部函數已經返回…

干貨分享 | TSMaster 中 Hex 文件編輯器使用詳細教程

TSMaster 軟件的 Hex 文件編輯器提供了文件處理的功能&#xff0c;這一特性讓使用 TSMaster 軟件的用戶可以更便捷地對 Hex、bin、mot、s19 和 tsbinary 類型的文件進行處理。 本文重點講述 TSMaster 中 Hex 文件編輯器的使用方法&#xff0c;該編輯器能實現將現有的 Hex、bin、…

@vue-office/excel 解決移動端預覽excel文件觸發軟鍵盤

先直接上代碼 不耽誤大家時間 標明下插件庫 非常感謝作者提供預覽插件 vue-office/excel 只需要控制CSS :deep(.x-spreadsheet-overlayer) {.x-spreadsheet-selectors {display: none !important;} } :deep(.x-spreadsheet-bottombar) {li.active {user-select: none !import…

家政上門系統源碼,家政上門預約服務系統開發涉及的主要功能

家政上門預約服務系統開發是指建立一個在線平臺或應用程序&#xff0c;用于提供家政服務的預約和管理功能。該系統的目標是讓用戶能夠方便地預約各種家政服務&#xff0c;如保潔、家庭護理、月嫂、家電維修等&#xff0c;并實現服務供應商管理和訂單管理等功能。 以下是開發家政…

Windows API 速查

Windows API 函數大全 (推薦)&#xff1a;https://blog.csdn.net/xiao_yi_xiao/article/details/121604742Windows API 在線參考手冊&#xff1a;http://www.office-cn.net/t/api/index.html?web.htmWindows 開發文檔 (官方)&#xff1a;https://learn.microsoft.com/zh-cn/wi…

linux驅動學習(三)之uboot與內核編譯

需要板子一起學習的可以這里購買&#xff08;含資料&#xff09;&#xff1a;點擊跳轉 GEC6818內核源碼下載&#xff1a;點擊跳轉 一、環境配置 由于GEC6818對應是64位系統&#xff0c;虛擬機中的linux系統也要是64位&#xff0c;比如&#xff1a;ubuntu16.04.rar …

Bee 支持 與 mybatis-plus 混用嗎?

Bee 支持 與 mybatis-plus 混用嗎&#xff1f; 你是在什么場景下要混用呢? mybatis-plus是基于mybatis. 而Bee本身就是一個ORM框架了. Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鴻蒙) Bee Bee支持的數據庫 1.MySQL 2.Oracle 3.SQL…

elasticsearch的常規操作--增刪改查和批量處理

1、_cat 查詢 GET /_cat/nodes&#xff1a; 查看所有節點 GET /_cat/health&#xff1a; 查看es 健康狀況 GET /_cat/master&#xff1a; 查看主節點 GET /_cat/indices&#xff1a;查看所有索引show databases; 2、索引一個文檔&#xff08;保存&#xff09; 保存一個數據&…

某紅書旋轉滑塊驗證碼分析與協議算法實現(高通過率)

文章目錄 1. 寫在前面2. 接口分析3. 驗證軌跡4. 算法還原 【&#x1f3e0;作者主頁】&#xff1a;吳秋霖 【&#x1f4bc;作者介紹】&#xff1a;擅長爬蟲與JS加密逆向分析&#xff01;Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并致…

力扣SQL50 學生們參加各科測試的次數 查詢 三表查詢

Problem: 1280. 學生們參加各科測試的次數 &#x1f468;?&#x1f3eb; 參考題解 join等價于inner join&#xff0c;不用關聯條件的join等價于cross join Code select stu.student_id,stu.student_name, sub.subject_name,count(e.subject_name) attended_exams from Stud…

關于windosw打開安全中心空白的解決方案

關于windosw打開安全中心空白的解決方案 問題如下 問題如下 之后點擊一片空白 解決方案如下 按下WINR&#xff0c;輸入regedit回車找到路徑&#xff1a;“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecurityHealthService”&#xff0c;然后雙擊右邊的“start”…

【最新鴻蒙應用開發】——關系型數據庫簡單上手(RDB)

關系型數據庫&#xff08;RDB&#xff09; 關系型數據庫&#xff08;Relational Database&#xff0c;RDB&#xff09;是一種基于關系模型來管理數據的數據庫。關系型數據庫基于SQLite組件提供了一套完整的對本地數據庫進行管理的機制&#xff0c;對外提供了一系列的增、刪、改…

【cocos sreator】判定多邊形和多邊形相交

核心代碼&#xff1a; cc.Intersection.polygonPolygon(points2, points) 拖拽物品拖到多個目標位置判定&#xff0c;取最近的&#xff1a; getTargetItem(collider2: cc.PolygonCollider, touchPos: cc.Vec2, targetRoot: cc.Node) {let length 99999;let target null;//col…

windows 下編譯 TessRact+leptonica 識別圖片文字

目錄 1、下載 2. 編譯基礎依賴庫 1.1 zlib 1.2 jpegsr9f 1.3 lpng1643 1.4 libgif 3. 編譯tifflib 4. 配置nasm到系統環境中 5. 編譯 libjpeg-turbo 6 編譯leptonica 7. 編譯tesseract 8. 測試驗證 1、下載 下載tesseract5.3.2 下載leptonica1.83.1 下載l…

1638. 統計只差一個字符的子串數目

題目 給你兩個字符串 s 和 t&#xff0c;請找出 s 中的非空子串的數目&#xff0c;這些子串滿足替換一個不同字符以后&#xff0c;是 t 串的子串。換言之&#xff0c;請你找到 s 和 t 串中恰好只有一個字符不同的子字符串對的數目。 一個子字符串是一個字符串中連續的字符。 …

【全開源】旅游門票預訂系統(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp開發的旅游門票預訂系統&#xff0c;支持景點門票、導游產品便捷預訂、美食打卡、景點分享、旅游筆記分享等綜合系統&#xff0c;提供前后臺無加密源碼&#xff0c;支持私有化部署。 ?便捷你的每一次出行&#x1f30d; &#x1f31f; 輕松預訂…

PMP中的各種圖

單、雙代號網絡圖 區別 內容 箭線圖&#xff08;ADM&#xff09;-雙 箭線活動 節點依賴關系 箭線圖只能表示一種FS的關系 規劃和控制項目活動進度的項目 &#xff08;建筑、軟件&#xff09; 前導圖&#xff08;PDM&#xff09;-單 節點代表活動 前導圖法可以體現多種邏…