C++那些事之小項目實戰-進程間通信

小項目實戰之進程間通信

進程間通信是一個非常重要的話題,特別是像一些大型項目都有它的影子,例如:PostgreSQL使用了管道完成copy的進程間通信,那么本節也將基于這個主題,使用C++去搭建一個進程間通過管道通信的demo出來,本節將會結合前面幾節講的內容,給出一個比較完整的實戰例子出來:

  • mutex

  • condition_variable

  • thread

注:本節的完整代碼會放在星球中。

首先一個很簡單的管道用法為:

  • 創建一個管道

它會creating a pipe, forking, and invoking the shell.

//?FILE?*popen(const?char?*command,?const?char?*type);
pipe?=?popen(command.c_str(),?"w");
  • 關閉一個管道

//?int?pclose(FILE?*stream);
pclose(pipe);

接下來我們就只需要往里面寫與讀了,原理也很簡單,例如:

此時便會把data寫入到前面創建的管道中。

//?size_t?fwrite(?const?void*?buffer,?size_t?size,?size_t?count,?FILE*?stream?);
size_t?written?=?fwrite(data.c_str(),?sizeof(char),?data.size(),?pipe);

如果從管道中讀取,我們可以使用fread或者fgets,fgets 會在讀取到換行符或達到緩沖區大小時停止,而 fread 會盡可能多地讀取數據,直到達到指定的字節數或遇到文件結尾。同理,上面的fwrite可以替換為fputs。

現在,一個管道的基本使用介紹完了,如何寫一個完整的demo?

很簡單,我們只需要創建兩個線程,一個讀,一個寫,然后寫線程往pipe里面寫數據,讀線程從pipe里面讀即可。

例如:

std::thread?writer_thread(write_to_pipe);
std::thread?reader_thread(read_from_pipe);writer_thread.join();
reader_thread.join();

寫線程需要做的事情就是調用fwrite丟數據即可

ProcessWriter?writer("cat?>?/tmp/pipe");//?寫入數據
std::string?message?=?"Hello?pipe!\n";
if?(!writer.write(message))?{std::cerr?<<?"Failed?to?write?data?to?pipe"?<<?std::endl;
}

同理,讀線程取數據:

ProcessReader?reader("/tmp/pipe");
//?讀取數據
std::string?message;
while?(reader.read(message))?{//?do?something
}

最后的效果就是:

Read?from?pipe:?Hello?pipe!

跟我一起實踐寫代碼,戳這里呀~

15f1200824b8f4a62574aa956045f0f3.jpeg

往期推薦:

向量數據庫milvus源碼剖析之開篇

熱度更新,手把手實現工業級線程池

1013ab8b9ad472b076a55bf453cdbc15.jpeg

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

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

相關文章

聚變反應堆設計的一些關鍵方面和最新進展

聚變反應堆設計是一個復雜且高度專業化的領域&#xff0c;旨在實現核聚變反應以產生清潔能源。以下是對聚變反應堆設計的一些關鍵方面和最新進展的概述&#xff1a; ### 一、聚變反應堆的基本原理 核聚變是兩個較輕的原子核結合成一個較重的原子核&#xff0c;并在此過程中釋…

消除筆怎么用?教你消除筆的正確用法

消除筆&#xff0c;也稱為橡皮擦工具或克隆筆工具&#xff0c;是圖像處理軟件中的一種常用工具。它的主要作用是通過取樣圖像中的某一部分&#xff0c;然后覆蓋掉不想要的圖像內容&#xff0c;從而實現修復、去除瑕疵等效果。那么有哪些軟件具有消除筆功能&#xff0c;又是怎么…

網絡安全入門教程(非常詳細)從零基礎入門到精通,看完這一篇就夠了。

學前感言: 1.這是一條堅持的道路,三分鐘的熱情可以放棄往下看了.2.多練多想,不要離開了教程什么都不會了.最好看完教程自己獨立完成技術方面的開發.3.有時多google,baidu,我們往往都遇不到好心的大神,誰會無聊天天給你做解答.4.遇到實在搞不懂的,可以先放放,以后再來解決. 基…

歐洲杯:高精度定位技術,重塑體育賽事新體驗

隨著科技的飛速發展&#xff0c;體育賽事的觀賞體驗與競技水平正被不斷推向新的高度。在即將到來的2024年歐洲杯賽場上&#xff0c;一項革命性的技術——高精度定位&#xff0c;正悄然改變著比賽的每一個細節&#xff0c;為球迷們帶來前所未有的觀賽享受&#xff0c;同時也為運…

昇思25天學習打卡營第7天|保存與加載

Python語言 AI框架&#xff1a;Mindspore 1.模型構建 class Network(nn.Cell):def __init__(self):super().__init__()self.flatten nn.Flatten()self.dense_relu_sequential nn.SequentialCell(nn.Dense(28*28, 512, weight_init"normal", bias_init"zeros…

力扣雙指針算法題目:移動零

1.題目 . - 力扣&#xff08;LeetCode&#xff09; 2.思路解析 這個題目的思路和“使用遞歸排序快速排序解決數組的排序問題”相同 class solution { public:void QuickSort(vector<int>& nums, int left, int right){if (left > right) return;int key left…

VSCode常用的一些插件

Chinese (Simplified) 漢語&#xff08;簡體&#xff09;拓展包。 Auto Close Tag 可以自動增加xml/html的閉合標簽。 CodeSnap 截圖神器。截圖效果在下面。 Dracula Official vscode一個很好看的主題。 Git Graph git管理工具。 GitHub Repositories 有了它&#xff0c;不…

AI一鍵音頻轉文字工具 速度超快,支持實時轉換,無需聯網,本地整合包下載

這是 CapsWriter-Offline &#xff0c;一個 PC 端的語音輸入、字幕轉錄工具。可用實現簡單一鍵將音頻文件轉換成文字的懶人工具。 兩個功能&#xff1a; 1、實時轉換&#xff0c;按下鍵盤上的 大寫鎖定鍵&#xff0c;錄音開始&#xff0c;當松開 大寫鎖定鍵 時&#xff0c;就會…

TaskDisplayArea、ActivityStack、Task以及ActivityRecord之間的關系

目錄 一、TaskDisplayArea、ActivityStack、TaskRecord以及ActivityRecord關系圖 二、TaskDisplayArea、ActivityStack、Task以及ActivityRecord相關代碼 1、ActivityRecord 2、Task 3、ActivityStack 4、TaskDisplayArea 前言&#xff1a;對TaskDisplayArea、ActivitySt…

go語言day08 泛型 自定義錯誤處理 go:協程

泛型&#xff1a; 拋錯誤異常 實現error接口類型 用java語言解釋的話&#xff0c;實現類需要重寫error類型的抽象方法Error().這樣就可以自定義異常處理。 回到go語言&#xff0c;在Error()方法中用*argError 這樣一個指針類來充當error接口的實現類。 在f2()方法中定義返回值…

CONFIG_FEATURE_MOUNT_NFS

CONFIG_FEATURE_MOUNT_NFS是一個Linux內核配置選項&#xff0c;它允許系統支持掛載NFS文件系統。如果您在編譯內核或構建根文件系統時遇到關于NFS支持的問題&#xff0c;您可能需要檢查這個配置選項是否被啟用。在某些情況下&#xff0c;例如使用BusyBox作為工具集時&#xff0…

漏洞分析|OpenSSH漏洞(CVE-2024-6387)

一、網傳漏洞POC信息 漏洞編號&#xff1a;CVE-2024-6387 漏洞名稱&#xff1a;OpenSSH regreSSHion 漏洞 POC上傳者&#xff08;作者不確定&#xff09;&#xff1a;7etsuo 發布日期&#xff1a;2024-07-01 漏洞類型&#xff1a;遠程代碼執行&#xff08;RCE&#xff09;…

昇思MindSpore學習筆記3-03熱門LLM及其他AI應用--基于MobileNetv2的垃圾分類

摘要&#xff1a; MindSpore AI框架使用MobileNetv2模型開發垃圾分檢代碼。檢測本地圖像中的垃圾物體&#xff0c;保存檢測結果到文件。記錄了開發過程和步驟&#xff0c;包括環境準備、數據下載、加載和預處理、模型搭建、訓練、測試、推理應用等。 1、實驗目的 了解垃圾分…

解決pip默認安裝位置在C盤方法

新版python中使用pip命令將opencv庫安裝到base環境中 首先我們打開命令控制窗口&#xff0c;激活base環境&#xff0c;輸入conda activate base 然后檢查一下自己base環境中是否安裝opencv庫&#xff0c;輸入conda list 往下找&#xff0c;找到o開頭的地方&#xff0c;發現是…

達夢數據庫 頁大小與數據庫字段長度的關系

對于達夢數據庫實例而言&#xff0c;頁大小 (page_size)、簇大小 (extent_size)、大小寫敏感 (case_sensitive)、字符集 (charset) 這四個參數&#xff0c;一旦確定無法修改&#xff1b;如果過程中發現這些數據設置的不對&#xff0c;只能是重新新建數據庫實例&#xff0c;而不…

GraphQL與RESTful API的區別和優勢

GraphQL GraphQL是一種用于API設計的語言和查詢協議&#xff0c;由Facebook于2015年推出。它允許客戶端向服務器指定他們需要的數據字段&#xff0c;而不是像RESTful API那樣請求整個資源然后過濾數據。在GraphQL中&#xff0c;客戶端發送一個單一的請求&#xff0c;而服務器返…

通過npm安裝OpenLayers庫,vue3+ts環境下OpenLayers實現加載本地高德離線地圖并添加標記點、標記點氣泡及標記點氣泡按鈕事件

在Vue 3和TypeScript的環境下使用OpenLayers來加載高德地圖的離線瓦片&#xff0c;并添加標記點、標記點氣泡以及處理氣泡上的按鈕事件&#xff0c;涉及到幾個步驟。首先&#xff0c;需要明確高德地圖的瓦片數據格式和如何配置OpenLayers以使用這些瓦片。接著&#xff0c;我們需…

零信任沙箱是什么?零信任沙箱有什么作用?

零信任沙箱是什么&#xff1f;零信任沙箱有什么作用&#xff1f; 在當今數字化時代&#xff0c;數據安全已成為各行各業的核心關注點。零信任沙箱作為一種新興的安全技術&#xff0c;不僅適用于政府和金融等關鍵領域&#xff0c;其實用性覆蓋了更廣泛的場景&#xff0c;如醫療…

數智化配補調:零售品牌增長新引擎

隨著科技的不斷進步和消費者需求的日益個性化、多元化&#xff0c;傳統服裝行業正面臨著前所未有的挑戰與機遇。在這個快速變化的時代&#xff0c;如何精準把握市場脈搏&#xff0c;實現庫存的高效管理&#xff0c;成為了服裝品牌生存與發展的關鍵。數智化配補調策略應運而生&a…

mysql定時備份數據庫

文章目錄 核心目標思路具體方法一、編寫腳本二、修改文件屬性三、找一個mysqldump文件四、把.sh放到定時器里 其它&#xff1a;windows的腳本 核心目標 解決數據庫定時備份的工作。centos環境。 思路 用centos的crontab定時執行腳本。 具體方法 一、編寫腳本 編寫backup_…