linux多線(進)程編程——(4)進程間的傳音術(命名管道)

前言(前情回顧)

進程君(父進程)在開發出匿名管道這門傳音術后,解決了和自己孩子(子進程)間的溝通問題,父子關系趨于融洽。和孩子溝通后,進程君發現,自己脫離群眾太久了,應該加強和群眾的溝通。但是進程君與眾位道友間沒有血緣關系,無法使用匿名管道進行溝通。于是進程君決定改良匿名管道這種技術,讓天下道友都能與自己暢通無阻的溝通,最終產生了一種無暇的傳音技術——命名管道(FIFO)。

命名管道

我在上一篇文章中提到過:
“兩個沒有血緣關系的進程間可以同時打開相同的文件,進程內部分配對應的文件描述符,映射關系記錄在PCB中,而兩個進程間的fd分配時獨立的,也就是fd在多進程中不是唯一的。當然我們也可以在進程1中向文件1寫入數據,進程2從文件1中讀取數據,構成一個偽管道。”
在這里插入圖片描述
其實這里面的偽管道就是命名管道的意思。創建一個命名管道就是在Linux文件系統下創建一個特殊的fifo文件。與匿名管道的區別是,匿名管道也是文件,但它對文件系統不可見。而命名管道是一個可以在文件系統中看見的文件。

命名管道的創建:mkfifo()

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *filename, mode_t mode);

這里的filename是一個字符串,描述了命名管道在文件系統中的路徑,當字符串中沒有‘/’出現是則管道創建在當前目錄下。mode一般為0777,對應一個權限掩碼,這里不做重點。直接寫入即可。
我們先測試一下這個函數,在這里我創建了三個命名管道分別為demo1,demo2,demo3,編譯后運行:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>int main() {int res1 = mkfifo("demo1",0777);		// 創建于當前路徑下int res2 = mkfifo("./demo2",0777);		// 創建于當前路徑下int res3 = mkfifo("../demo3",0777);		// 創建于上一級路徑下while(1);return 0;
}

觀察運行前后的工程目錄
在這里插入圖片描述
可以發現運行后我們的工程目錄下出現了三個新的文件,這三個文件就是我們的命名管道。這就是命名管道對文件系統是可見的這句話的含義。
相信一些腦洞大開的道友已經有了想法,既然命名管道在文件系統中可見,也就說明所有的進程都可以訪問這個文件,那么只要我向這個進程中讀寫文件,是不是就完成了進程間的通信?
答案是:完全正確
如何實現對文件的讀和寫?不清楚的道友可以去看我之前寫的一篇文章:linux多線(進)程編程——(1)前置知識
我們直接上代碼,為了體現出命名管道與匿名管道的區別,這次我們要真正實現在兩個程序間通信,所以我們要寫兩個C語言源文件。

proc1.c:創建命名管道并且向命名管道內寫入數據

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main() {int res1 = mkfifo("fifo_demo", 0777);int wfd = open("fifo_demo", O_WRONLY);	// 只寫char send_buf[20];bzero(send_buf, 20);memcpy(send_buf, "hello, world!", 14);while(1) {write(wfd, send_buf, 20);sleep(1);}return 0;
}

proc2.c:接收管道內的數據

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main() {usleep(500*1000);// int res1 = mkfifo("fifo_demo", 0777);int rfd = open("fifo_demo", O_RDONLY);	// 只讀char recv_buf[20];while(1) {bzero(recv_buf, 20);read(rfd, recv_buf, 20);printf("%s\n", recv_buf);sleep(1);}return 0;
}

在命令行中運行程序,其中后面加一個&,表示在后臺運行,讓出終端

lol@qingfenfuqin:~/work/linux_study/pipe/fifo$ gcc -o proc1 proc1.c
lol@qingfenfuqin:~/work/linux_study/pipe/fifo$ gcc -o proc2 proc2.c
lol@qingfenfuqin:~/work/linux_study/pipe/fifo$ ./proc1&
[1] 9729
lockin@qingfenfuqin:~/work/linux_study/pipe/fifo$ ./proc2
hello, world!
hello, world!
hello, world!
hello, world!
...

注意:
(1)在兩個程序中每次寫入和讀取的字節數量保持一致。
(2)在程序編寫時就應該知道管道的名字。
(3)管道是單工通信,開發時不能又讀又寫,僅能以只讀(O_RDONLY)或者只寫(O_WRONLY)打開。

小結

這節課的知識點:
(1)命名管道的創建方法:mkfifo();
(2)命名管道與文件的關系,如何操作命名管道:read();write();
(3)如何在后臺運行一個進程:&。
(4)命名管道與匿名管道的差異,以及對文件系統的可見性。

下一集我們將學習進程間第二中通信方式——共享內存的前置知識:linux多線(進)程編程——(5)虛擬內存與內存映射

結束語

“進程君開發出匿名管道與命名管道后,九天十地的道友終于可以暢通無阻的溝通交流了。”
聽完這個修仙界傳說,不知不覺間你的識海中也多了一道無暇神通,千里傳音術——管道。
祝各位道友早日神功大成。

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

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

相關文章

在IDEA里面建立maven項目(便于java web使用)

具體步驟&#xff1a; 第一次有的電腦你再創建項目的時候右下角會提醒你彈窗&#xff1a;讓你下載沒有的東西 一定要下載&#xff01;&#xff01;可能會很慢 運行結果&#xff1a; 因為他是默認的8080端口所以在運行的時候輸入的url如下圖&#xff1a; 新建了一個controller代…

【13】數據結構之樹結構篇章

目錄標題 樹Tree樹的定義樹的基本概念樹的存儲結構雙親表示法孩子表示法孩子兄弟表示法 二叉樹二叉樹與度不超過&#xff12;的普通樹的不同之處二叉樹的基本形態二叉樹的分類二叉樹的性質 二叉樹的順序存儲二叉樹的鏈式存儲二叉樹的鏈式存儲的結點結構樹的遍歷先序遍歷中序遍歷…

雷達生命探測儀,地震救援的生命探測先鋒|鼎躍安全

在地震、山體滑坡、坍塌建筑等突發災害中&#xff0c;會嚴重摧毀建筑物&#xff0c;造成倒塌和人員被困&#xff1b;在瓦礫堆、混凝土板層中&#xff0c;受困人員的生命安全常常面臨嚴峻威脅。傳統救援手段通常存在響應時間長、監測精度有限等不足。 救援現場往往環境復雜&…

512天,倔強生長:一位技術創作者的獨白

親愛的讀者與同行者&#xff1a; 我是倔強的石頭_&#xff0c;今天是我在CSDN成為創作者的第512天。當系統提示我寫下這篇紀念日文章時&#xff0c;我恍惚間想起了2023年11月19日的那個夜晚——指尖敲下《開端——》的標題&#xff0c;忐忑又堅定地按下了“發布”鍵。那時的我…

數據結構*集合框架順序表-ArrayList

集合框架 常見的集合框架 什么是順序表 順序表是一種線性表數據結構&#xff0c;它借助一組連續的存儲單元來依次存儲線性表中的數據元素。一般情況下采用數組存儲。 在數組上完成數據的增刪查改。 自定義簡易版的順序表 代碼展示&#xff1a; public interface IArray…

使用openpyxl時的一些注意點

一、是否需要close()&#xff1f; 在使用 openpyxl 時&#xff0c;wb.save() 后一般不需要再手動調用 wb.close()。wb.save() 會自動處理文件寫入和釋放。 如果是使用openpyxl.load_workbook(filename, read_onlyTrue) 打開了一個只讀模式的工作簿&#xff0c;此時會建立文件…

Python爬蟲第11節-解析庫Beautiful Soup的使用上篇

目錄 前言 一、Beautiful Soup 簡介 1.1 Beautiful Soup概述 1.2 準備工作 1.3 解析器 二、基本使用 三、節點選擇器的使用 3.1 選擇元素 3.2 提取信息 3.2.1 獲取名稱 3.2.2 獲取屬性 3.2.3 獲取內容 3.3 嵌套選擇 3.4 關聯選擇 3.4.1 子節點和子孫節點 3.4.2…

【Docker-13】Docker Container容器

Docker Container&#xff08;容器&#xff09; 一、什么是容器&#xff1f; 通俗地講&#xff0c;容器是鏡像的運行實體。鏡像是靜態的只讀文件&#xff0c;而容器帶有運行時需要的可寫文件層&#xff0c;并且容器中的進程屬于運行狀態。即容器運行著真正的應用進程。容器有…

Spring Cache(筆記)

簡介&#xff1a; 常用注解&#xff1a;

大模型Qwen32b(FP16精度)部署所需的顯存大小和并發數計算分析

大家好&#xff0c;我是微學AI&#xff0c;今天給大家介紹一下大模型Qwen32b(FP16精度)部署所需的顯存大小和并發計算分析。 文章目錄 1. 大模型顯存需求分析1.1 模型參數與顯存占用1.2 不同精度對顯存的影響 2. 不同顯卡配置下的并發能力2.1 80G顯卡并發能力2.2 64G顯卡并發能…

【euclid】10.2 2D變換模塊(transform2d.rs)Arbitrary trait

源碼 #[cfg(feature "arbitrary")] impl<a, T, Src, Dst> arbitrary::Arbitrary<a> for Transform2D<T, Src, Dst> whereT: arbitrary::Arbitrary<a>, {fn arbitrary(u: &mut arbitrary::Unstructured<a>) -> arbitrary::Res…

MAC Mini M4 上測試Detectron2 圖像識別庫

斷斷續續地做圖像識別的應用&#xff0c;使用過各種圖像識別算法&#xff0c;一開始使用openCV 做教室學生計數的程序。以后又使用YOLO 做醫學傷口檢測程序。最近&#xff0c;開始使用meta 公司的Detectron2.打算做OCR 文檔結構分析 Detectron2 的開發者是 Meta 的 Facebook AI…

一天時間,我用AI(deepseek)做了一個配色網站

前言 最近在開發顏色搭配主題的相關H5和小程序&#xff0c;想到需要補充一個web網站&#xff0c;因此有了這篇文章。 一、確定需求 向AI要答案之前&#xff0c;一定要清楚自己想要做什么。如果你沒有100%了解自己的需求&#xff0c;可以先讓AI幫你理清邏輯和思路&#xff0c;…

機器視覺用消色差雙合透鏡

光學系統案例&#xff1a;機器視覺用消色差雙合透鏡 一、設計規格 1. 應用場景&#xff1a;專為工業相機成像而設計&#xff0c;工作于可見光波段&#xff0c;旨在滿足該領域對高精度成像的需求。 2. 核心參數&#xff1a; ? 焦距&#xff1a;精確要求達到 50 mm 1%&#…

批量歸一化(Batch Normalization)原理與PyTorch實現

批量歸一化&#xff08;Batch Normalization&#xff09;是加速深度神經網絡訓練的常用技術。本文通過Fashion-MNIST數據集&#xff0c;演示如何從零實現批量歸一化&#xff0c;并對比PyTorch內置API的簡潔實現方式。 1. 從零實現批量歸一化 1.1 批量歸一化函數實現 import t…

feedback

這個文件 lib/pages/feedback/index.dart 是一個反饋/留言表單頁面的實現&#xff0c;主要功能是&#xff1a; 表單收集功能&#xff1a; 真實姓名&#xff08;必填&#xff09;聯系電話&#xff08;必填&#xff0c;需要驗證手機號格式&#xff09;電子郵箱&#xff08;選填&a…

數據倉庫標準庫模型架構相關概念淺講

數據倉庫與模型體系及相關概念 數據倉庫與數據庫的區別可參考&#xff1a;數據庫與數據倉庫的區別及關系_數據倉庫和數據庫-CSDN博客 總之&#xff0c;數據庫是為捕獲數據而設計&#xff0c;數據倉庫是為分析數據而設計 數據倉庫集成工具 在一些大廠中&#xff0c;其會有自…

適用于 HAL 的 AIDL

目錄 設計初衷 注意 編寫AIDLHAL接口 查找AIDLHAL接口 擴展接口 將現有HAL從HIDL轉換為AIDL AIDL與HIDL之間的主要差異 針對HAL的供應商測試套件(VTS)測試 Android 11 中引入了在 Android 中使用 AIDL 實現 HAL 的功能, 從而可以在不使用 HIDL 的情況下實現 Android 的部分…

leetcode0547. 省份數量-medium

1 題目&#xff1a;省份數量 官方標定難度&#xff1a;中 有 n 個城市&#xff0c;其中一些彼此相連&#xff0c;另一些沒有相連。如果城市 a 與城市 b 直接相連&#xff0c;且城市 b 與城市 c 直接相連&#xff0c;那么城市 a 與城市 c 間接相連。 省份 是一組直接或間接相…

【專題刷題】雙指針(一)

&#x1f4dd;前言說明&#xff1a; 本專欄主要記錄本人的基礎算法學習以及LeetCode刷題記錄&#xff0c;按專題劃分每題主要記錄&#xff1a;1&#xff0c;本人解法 本人屎山代碼&#xff1b;2&#xff0c;優質解法 優質代碼&#xff1b;3&#xff0c;精益求精&#xff0c;…