Linux -- 進程間通信的五種方式

IPC(InterProcess Communication)的方式通常有管道(包括無名管道和命名管道)、消息隊列、信號量、共享存儲、Socket、Streams等。其中Socket和Stream支持不同主機上的兩個進程IPC。

  1. 管道(Pipes):管道是一種半雙工的通信方式,用于具有親緣關系的進程間通信。它通常用于父子進程或者兄弟進程之間。管道可以是匿名管道,也可以是命名管道。

  2. 消息隊列(Message Queues):消息隊列是一種通過消息傳遞進行通信的方式。發送方將消息發送到隊列中,接收方從隊列中接收消息。消息隊列可以實現進程間的異步通信。

  3. 信號量(Semaphores):信號量是一種計數器,用于控制對共享資源的訪問。它通常用于同步進程之間的操作,以避免競爭條件。

  4. 共享內存(Shared Memory):共享內存是一種允許多個進程訪問同一塊內存區域的方式。這種方式通常比較高效,但需要處理進程間的同步和互斥。

  5. 套接字(Sockets):套接字是一種網絡編程接口,不僅可以用于不同主機間的進程通信,也可以用于同一主機上的進程通信。套接字可以基于網絡協議(如TCP/IP)或本地協議(如UNIX域套接字)實現。

一、管道

管道(Pipes)是一種在Unix和類Unix系統中常見的進程間通信(IPC)機制,用于在具有親緣關系的進程之間傳遞數據。管道是一個單向通道,允許一個進程將輸出直接發送到另一個進程的輸入。它是一種半雙工通信方式,即數據只能單向流動,不能雙向傳輸。

類型

  1. 匿名管道(Anonymous Pipes):匿名管道是最簡單的管道形式,它只存在于內存中,并且通常用于父子進程之間的通信。在Unix系統中,可以使用pipe()系統調用創建匿名管道。

  2. 命名管道(Named Pipes):命名管道是一種具有持久性的管道,它以文件的形式存在于文件系統中,并允許無關進程之間進行通信。命名管道通常用于不具有親緣關系的進程之間的通信。

特點

  • 單向通信:管道是單向的,數據只能沿著管道的方向流動,不能雙向傳輸。

  • 半雙工:管道是半雙工的,即數據只能在一個方向上傳輸。如果需要雙向通信,通常需要創建兩個管道。

  • FIFO(先進先出):管道遵循FIFO的原則,即數據按照寫入的順序從管道中讀取出來。

使用

在Unix系統中,可以使用pipe()系統調用創建匿名管道,它返回兩個文件描述符,一個用于讀取,一個用于寫入。然后可以使用fork()創建一個新的進程,在父子進程之間共享管道,并使用dup2()系統調用將管道文件描述符重定向到標準輸入或標準輸出。接著,一個進程可以通過寫入管道的方式向另一個進程發送數據,另一個進程則可以通過讀取管道來接收數據。

示例

下面是一個簡單的C語言示例,演示了如何在父子進程之間使用匿名管道進行通信:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>int main()
{int fd[2];int pid;char buf[128];//創建管道if(pipe(fd) == -1) { printf("creat pipe failed\n");}//創建子進程pid = fork();if(pid < 0) {printf("creat child faild\n");} else if(pid > 0) {    //父進程printf("this is father\n");close(fd[0]); //關閉讀取端//向管道寫數據write(fd[1], "hello from father", strlen("hello from father"));wait(NULL);} else {printf("this is child\n");close(fd[1]); //關閉寫入端read(fd[0], buf, sizeof(buf));  //從管道讀數據printf("child print: %s\n", buf);exit(1);}return 0;
}

程序執行結果如下:?

?

命名管道(Named Pipes)的使用:

命名管道是一種具有持久性的管道,它以文件的形式存在于文件系統中,并允許無關進程之間進行通信。相比于匿名管道,命名管道允許不具有親緣關系的進程之間進行通信。

創建命名管道

在Unix/Linux系統中,可以使用mkfifo()函數創建命名管道。命名管道創建后,會在文件系統中生成一個特殊類型的文件,它可以像普通文件一樣被打開、讀取和寫入。

使用命名管道

使用命名管道和使用普通文件一樣,可以使用文件I/O操作來讀取和寫入數據。不同的是,命名管道的數據讀取和寫入是以先進先出(FIFO)的方式進行的,即寫入的數據按照寫入的順序從管道中讀取出來。

特點

  • 命名管道是持久性的,創建后會一直存在于文件系統中,直到被顯式刪除。
  • 允許不具有親緣關系的進程之間進行通信。
  • 數據按照寫入的順序從管道中讀取出來,具有先進先出(FIFO)的特性。

?

示例

下面是一個簡單的C語言示例,演示了如何創建和使用命名管道:

先介紹一下mkfifo:mkfifo?是用于創建命名管道(FIFO)的系統調用。在 Unix 和類 Unix 系統中,命名管道以文件的形式存在,可以用于不同進程之間進行通信。

mkfifo 函數原型

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

參數

  • pathname:要創建的命名管道的路徑。
  • mode:管道的權限,類似于 openchmod 中使用的權限位。常用權限包括 0666(表示管道文件可讀可寫)。

返回值

  • 成功時返回 0
  • 失敗時返回 -1,并設置 errno 以指示錯誤。

?注意:

命名管道的讀寫操作是同步的,這意味著:

  • 寫入進程會等待直到有讀取進程打開管道進行讀取。
  • 讀取進程會等待直到有寫入進程向管道寫入數據。

這導致如果你先運行寫入程序而沒有相應的讀取程序在運行,寫入程序會阻塞,等待讀取程序打開管道讀取數據。同樣地,如果你先運行讀取程序而沒有寫入程序在運行,讀取程序會阻塞,等待寫入程序向管道寫入數據。

為了避免這個問題,可以按以下步驟運行程序:

  1. 先運行讀取程序 reader,使其準備好從管道讀取數據。
  2. 然后運行寫入程序 writer,向管道寫入數據。
writer.c (寫入程序)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>#define FIFO_FILE "/tmp/my_fifo"int main() {// 創建命名管道,權限模式為 0600if (mkfifo(FIFO_FILE, 0600) == -1) {perror("mkfifo failed");exit(EXIT_FAILURE);}// 打開命名管道以寫入數據int fd = open(FIFO_FILE, O_WRONLY);if (fd == -1) {perror("open failed");exit(EXIT_FAILURE);}// 寫入數據到命名管道const char *message = "Hello, Named Pipe!";write(fd, message, sizeof(message));// 關閉文件描述符close(fd);return 0;
}
reader.c (讀取程序)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>#define FIFO_FILE "/tmp/my_fifo"int main() {char buffer[BUFSIZ];// 打開命名管道以讀取數據int fd = open(FIFO_FILE, O_RDONLY);if (fd == -1) {perror("open failed");exit(EXIT_FAILURE);}// 從命名管道讀取數據read(fd, buffer, sizeof(buffer));printf("Received: %s\n", buffer);// 關閉文件描述符close(fd);// 刪除命名管道文件unlink(FIFO_FILE);return 0;
}

程序運行結果:

?

?

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

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

相關文章

STM32中斷編程入門

文章目錄 一、 理論部分1.中斷系統2.中斷執行流程3.NVIC的基本結構4.EXTI介紹5.AFIO復用IO口 二、實驗目的&#xff1a;學習stm32中斷原理和開發編程方法。使用標準完成以下任務&#xff1a;&#xff08;一&#xff09;實驗一 開關控制LED的亮滅1.代碼部分2.運行結果 &#xff…

Qt | QFormLayout 類(表單布局)

01、上節回顧 Qt | QGridLayout 類(網格布局)02、簡介 1、QFormLayout 布局以兩列的形式列出其子項目, 2、QFormLayout 被分成兩列,左列是標簽(label)部分,通常由標簽 QLabel 組成,右列是由 字段(field)部分,通常是 QLineEdit 行編輯器,QSpinBox 旋轉框等部件,注意:…

【簡單易用,新人友好】一個輕量級生物信息學流程框架,從此解決99%的生物信息學流程搭建問題...

生物信息學數據分析流程的搭建是一項繁重而復雜的工作。隨著行業的發展&#xff0c;各種生信流程框架層出不窮&#xff0c;比如有: NextflowSnakemakeCWLWDL 各種標準&#xff0c;各種規則&#xff0c;令人眼花繚亂。選擇太多&#xff0c;往往令人無所適從。特別是新進入行業的…

小程序的深層了解

一:wxss的全局樣式和局部樣式 寫在文件上,第一個路徑會執行全局和局部自帶的wxss給wxml,會執行wxml,會執行json和js. 無論那個文件都會執行文件夾內的和外部的app.wxss,但是如果有一樣的屬性,則看屬性的權重,權重一樣,則設置局部樣式. 二:全局配置 wx:key"寫的是data內…

17.7K星開源產品分析平臺:Posthog

Posthog&#xff1a;開源洞察&#xff0c;產品優化的得力助手 - 精選真開源&#xff0c;釋放新價值。 概覽 PostHog是一個全面開源的平臺&#xff0c;旨在幫助團隊構建更好的產品。它提供了從產品分析到會話回放、功能標志和A/B測試等一系列工具&#xff0c;支持自托管&#x…

如何通過Nginx配置將請求轉發到conf.d目錄下的各個配置文件

目錄 如何通過Nginx配置將請求轉發到conf.d目錄下的各個配置文件1. 修改主配置文件 nginx.conf2. 在 conf.d 目錄中創建站點配置3. 設置站點根目錄和權限4. 檢查配置并重新加載Nginx總結 如何通過Nginx配置將請求轉發到conf.d目錄下的各個配置文件 在使用Nginx進行網站管理時&…

讀人工智能時代與人類未來筆記14_管控人工智能

1. 管控人工智能 1.1. 歷史上的戰場進一步推進到與數字網絡相連的所有地方 1.2. 數字程序現在控制著一個由眾多實體系統構成的龐大且仍在不斷增長的領域&#xff0c;而且越來越多的此類系統已實現網絡化 1.2.1. 在某些情況下甚至連門鎖和冰箱都實現了網絡化 1.2.2. 這催生出…

拋出異常時仍然需要記錄錯誤日志

場景&#xff1a;當service的方法執行拋出異常時&#xff0c;事務會發生回滾&#xff0c;導致無法記錄錯誤日志 解決&#xff1a;切面 其他&#xff1a;1.日志需要記錄日志標題&#xff0c;保存入參 2.失敗時會拋出異常&#xff1b;日志需要判斷執行是否成功&#xff0c;記錄…

2024年漢字小達人活動4個多月開賽:18道歷年選擇題和答案、解析

根據近年的安排&#xff0c;2024年第11屆漢字小達人比賽還有4個多月就啟動&#xff0c;那么孩子們如何利用這段時間有條不紊地備考呢&#xff1f;我的建議是兩手準備&#xff1a;①把小學1-5年級的語文課本上的知識點熟悉&#xff0c;重點是字、詞、成語、古詩。②把歷年真題刷…

聯想端游聯運SDK接入指南

1. 接入流程 本文檔主要介紹了 聯想PC游戲SDK接入流程、聯想游戲提供的功能、接入注意事項等。 1.1. 接入方式 1. 聯想游戲SDK2.1版本支持“賬號防沉迷支付”接入方式&#xff1b; a. 聯想提供賬號注冊、登錄等能力 b. 聯想提供防沉迷服務 c. 聯想提供游戲內支付 1.2. 對…

【學習筆記】計算機組成原理(八)

CPU 的結構和功能 文章目錄 CPU 的結構和功能8.1 CPU的結構8.1.1 CPU的功能8.1.2 CPU結構框圖8.1.3 CPU的寄存器8.1.4 控制單元CU和中斷系統 8.2 指令周期8.2.1 指令周期的基本概念8.2.2 指令周期的數據流 8.3 指令流水8.3.1 指令流水原理8.3.2 影響流水線性能的因素8.3.3 流水…

meinheld-gunicorn-flask VS uvicorn-gunicorn-fastapi 性能對比測試

本文會使用如下兩個項目&#xff1a;meinheld-gunicorn-flask 與 uvicorn-gunicorn-fastapi 前文有測過 Flask vs FastApi 性能對比測試&#xff0c;可能不夠有說服力&#xff0c;這次使用了號稱最快的wsgi或asgi服務器gunicorn來運行flask或fastapi。 上面meinheld-gunicorn…

數據庫-SQL性能分析

SQL執行頻率 慢查詢日志 慢查詢日志記錄了所有執行時間超過指定參數&#xff08;long_query_time&#xff0c;單位&#xff1a;秒&#xff0c;默認10秒&#xff09;的所有 SQL語句的日志。 MySQL的慢查詢日志默認沒有開啟&#xff0c;我們可以查看一下系統變量 slow_query_l…

html5 筆記02

目錄 01 svg的基本使用 02 svg繪圖 03 進程和線程 01 svg的基本使用 svg和canvas的區別: canvas: 1.canvas作為一個容器只有一個dom元素 ,內部元素無法使用dom操作 (canvas不能展開然后選擇不到 svg查看元素能選中因為是通過標簽控制的) 2.canvas 是配合js完成各種繪制效果 …

vue-route的路由配置中父組件沒有component怎么處理

概述 為了方便開發和維護&#xff0c;所以web前端的路由配置路徑和前端代碼文件路徑一般是一致的。但在實際開發中&#xff0c;項目可能會分很多級的菜單&#xff0c;由于很多菜單只有葉子菜單是真正的頁面。而中間菜單項只是一個路由配置。 為了正確路由到底層的功能頁面&…

指紋識別概念解析

目錄 1. 指紋是物證之首 1.1 起源于中國 1.2 發展于歐洲 1.3 流行于全世界 2. 指紋圖像 3. 指紋特征 4. 指紋注冊 5. 指紋驗證 6. 指紋辨識 1. 指紋是物證之首 指紋識別技術起源于中國、發展于歐洲、流行于全世界。自20世紀以來&#xff0c;指紋在偵破刑事案件、解決訴…

水泥超低排平臺哪家好?

隨著環保政策的加強和綠色發展理念的深入人心&#xff0c;水泥行業的超低排放改造已成為行業發展的新趨勢。選擇一個合適的水泥超低排平臺對于確保改造效果和實現企業的可持續發展至關重要。朗觀視覺小編將從多個角度出發&#xff0c;為您提供一份綜合評估與選擇攻略&#xff0…

Spring Boot 3.x 與 Spring Boot 2.x 的對比

Spring Boot 是 Java 開發領域的一個重要框架&#xff0c;它簡化了基于 Spring 的應用開發。隨著版本的不斷更新&#xff0c;Spring Boot 提供了更多功能、更好的性能以及更簡潔的配置。本文將詳細對比 Spring Boot 3.x 和 Spring Boot 2.x&#xff0c;探討它們之間的主要區別和…

[C語言]自定義類型詳解:結構體、聯合體、枚舉

目錄 &#x1f680;結構體 &#x1f525;結構體類型的聲明 &#x1f525;結構的自引用 &#x1f525;結構體變量的定義和初始化 &#x1f525;結構體內存對齊 &#x1f525;結構體傳參 &#x1f525;結構體實現位段&#xff08;位段的填充&可移植性&#xff09; &a…

安裝 Ubuntu桌面版,詳細步驟(附引導 U盤制作工具)

下載鏡像 安裝Ubuntu首先要下載鏡像包&#xff0c;訪問下面網址下載鏡像包 https://releases.ubuntu.com/ 選擇你要安裝的Ubuntu版本 將 .iso 文件保存到所需位置&#xff0c;下面會使用此文件創建可引導 U盤。 制作 Ubuntu 引導 U 盤 首先要找到一個大于4G的U盤&#xff…