通過管道實現C++ Linux獨立進程之間的通信和字符串傳遞

在Linux環境下,獨立進程之間的通信(IPC)可以通過多種方式實現,包括管道、消息隊列、共享內存和套接字。本文將詳細介紹如何使用管道(pipe)在C++中實現獨立進程之間的通信,并傳遞字符串。

一、管道簡介

管道是Linux系統提供的一種進程間通信機制。管道本質上是內核緩沖區,可以在進程之間傳遞數據。管道分為無名管道和有名管道(FIFO)。本文將使用無名管道實現進程間的字符串傳遞。

二、實現步驟

2.1 創建管道

使用?pipe()系統調用創建一個無名管道。pipe()會創建一個包含兩個文件描述符的數組:pipefd[0]用于讀取,pipefd[1]用于寫入。

2.2 創建子進程

使用?fork()系統調用創建一個子進程。在父進程中寫入數據到管道中,在子進程中讀取數據并打印出來。

2.3 代碼示例

以下是一個完整的C++代碼示例,演示如何通過管道在父子進程之間傳遞字符串:

#include <iostream>
#include <unistd.h>
#include <cstring>
#include <sys/wait.h>int main() {int pipefd[2];pid_t pid;char buffer[128];const char* message = "Hello from parent process!";// 創建管道if (pipe(pipefd) == -1) {perror("pipe");return 1;}// 創建子進程pid = fork();if (pid == -1) {perror("fork");return 1;}if (pid == 0) {// 子進程:從管道中讀取數據close(pipefd[1]); // 關閉寫端read(pipefd[0], buffer, sizeof(buffer));std::cout << "Child process received: " << buffer << std::endl;close(pipefd[0]); // 關閉讀端} else {// 父進程:向管道中寫入數據close(pipefd[0]); // 關閉讀端write(pipefd[1], message, strlen(message) + 1);close(pipefd[1]); // 關閉寫端// 等待子進程結束wait(NULL);}return 0;
}
?

2.4 代碼解釋

  1. 創建管道:使用?pipe(pipefd)創建管道,pipefd是一個包含兩個文件描述符的數組。

  2. 創建子進程:使用?fork()創建子進程。在父進程中,fork()返回子進程的PID;在子進程中,fork()返回0。

  3. 子進程讀取數據

    • 關閉管道的寫端(pipefd[1])。
    • 使用?read(pipefd[0], buffer, sizeof(buffer))從管道中讀取數據。
    • 打印讀取到的數據。
    • 關閉管道的讀端(pipefd[0])。
  4. 父進程寫入數據

    • 關閉管道的讀端(pipefd[0])。
    • 使用?write(pipefd[1], message, strlen(message) + 1)向管道中寫入數據。
    • 關閉管道的寫端(pipefd[1])。
    • 使用?wait(NULL)等待子進程結束。

三、運行結果

編譯并運行上述代碼,應該會看到如下輸出:

Child process received: Hello from parent process!
?

這表明父進程成功地通過管道將字符串傳遞給了子進程。

四、總結

通過本文的介紹,我們詳細講解了如何使用管道在C++中實現獨立進程之間的通信,并成功地傳遞字符串。管道是一種簡單而高效的進程間通信機制,適用于父子進程之間的數據傳輸。希望本文能幫助您更好地理解和應用Linux管道,提升開發效率。

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

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

相關文章

神經網絡極簡入門技術分享

1. 引言 神經網絡是深度學習的基礎&#xff0c;其設計靈感來源于人腦神經元的結構和工作方式。盡管現代神經網絡已經變得異常復雜&#xff0c;但其核心原理卻相對簡單易懂。本報告旨在通過剖析神經網絡的最基本單元——神經元&#xff0c;幫助初學者理解神經網絡的工作原理。 …

五、Hadoop集群部署:從零搭建三節點Hadoop環境(保姆級教程)

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月7日 專欄&#xff1a;Hadoop教程 前言&#xff1a; 想玩轉大數據&#xff0c;Hadoop集群是繞不開的一道坎。很多小伙伴一看到集群部署就頭大&#xff0c;各種配置、各種坑。別慌&#xff01;這篇教程就是你的“救生圈”。 …

科研項目管理:4款高效工具推薦與效率提升實踐

一般來說&#xff0c;科研項目往往涉及復雜的任務、跨部門協作以及嚴格的時間和預算限制。傳統的管理方式&#xff0c;如電子表格或郵件溝通&#xff0c;難以應對多任務并行、資源分配復雜的需求。借助現代項目管理工具&#xff0c;研究人員能夠優化工作流程、提升團隊協作效率…

如何統一修改word中所有英文字母的字體格式

1.需求分析 我想讓整篇論文中的所有英文字母格式都修改為Time New Roman格式。 2.直觀操作流程 點擊左上角開始 --> 點擊替換 --> 點擊更多 --> 點擊特殊格式 --> 選擇查找內容為任意字母(Y) --> 將光標點到替換內容 --> 點擊格式 --> 點擊字體 --> …

【疑難雜癥2025-003】Java-mvn項目在gitlab-ci構建鏡像時遇到的問題和解決方案

本文由Markdown語法編輯器編輯完成&#xff0e; 1.背景: 之前從同事手里接手了一個java的項目&#xff0c;是用maven構建項目的&#xff0e;由于我們的服務都是基于docker來部署的&#xff0c;因此這個java項目也是要編譯成docker image然后發布&#xff0e;但是之前一直都是…

【RT-Thread Studio】nor flash配置Fal分區

前置條件&#xff1a;【RT-Thread Studio】W25Q128配置 添加 FAL軟件包 配置SFUD驅動程序&#xff0c;使用FAL的設備為W25Q128 將fal_cfg.h和fal_flash_sfud_port.c提取出來&#xff0c;放到自己創建的fal_porting目錄。 修改 fal_flash_sfud_port.c struct fal_flash_dev n…

Spring MVC 視圖解析器 (ViewResolver) 如何配置? Spring Boot 是如何自動配置常見視圖解析器的?

我們來詳細分析一下視圖解析器 (ViewResolver) 的配置以及 Spring Boot 是如何自動配置它們的。 視圖解析器 (ViewResolver) 是什么&#xff1f; 在 Spring MVC 中&#xff0c;當控制器 (Controller) 方法處理完請求并返回一個邏輯視圖名 (String) 時&#xff0c;DispatcherS…

理解網站導航文件:robots.txt、sitemap.xml與LLMs.txt的全面解析

在當今數字化時代&#xff0c;網站不僅需要為人類用戶提供良好的瀏覽體驗&#xff0c;還需要考慮搜索引擎和人工智能系統的可訪問性。本文將深入探討三種關鍵的網站導航文件&#xff1a;傳統的robots.txt和sitemap.xml&#xff0c;以及新興的LLMs.txt&#xff0c;分析它們的功能…

leetcode 349. Intersection of Two Arrays

題目描述 題目限制0 < nums1[i], nums2[i] < 1000&#xff0c;所以可以開辟一個1001個元素的數組來做哈希表。 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> table(1001,0…

【軟件工程】軟件多缺陷定位方法總結

軟件多缺陷定位(Multi-Fault Localization)是軟件工程中的一個重要研究方向,旨在同時定位代碼中存在的多個缺陷(Bug)。由于多個缺陷可能相互干擾(如掩蓋錯誤行為),導致傳統單缺陷定位方法效果下降,因此需要針對多缺陷場景的特殊性設計方法。以下是常見的多缺陷定位方法…

【數據結構入門訓練DAY-30】數的劃分

文章目錄 前言一、題目二、解題思路結語 前言 本次訓練內容 訓練DFS。訓練解題思維。 一、題目 將整數n分成k份&#xff0c;且每份不能為空&#xff0c;任意兩份不能相同(不考慮順序)。 例如&#xff1a;n7&#xff0c;k3&#xff0c;下面三種分法被認為是相同的。 {1&a…

OpenCV進階操作:圖像直方圖、直方圖均衡化

文章目錄 一、圖像直方圖二、圖像直方圖的作用三、使用matplotlib方法繪制直方圖2.使用opencv的方法繪制直方圖&#xff08;劃分16個小的子亮度區間&#xff09;3、繪制彩色圖像的直方圖 四、直方圖均衡化1、繪制原圖的直方圖2、繪制經過直方圖均衡化后的圖片的直方圖3、自適應…

Open CASCADE學習|Geom2d_BezierCurve 類

概述 Open CASCADE 提供了幾何建模的強大工具集,其中 Geom2d_BezierCurve 類用于表示二維貝塞爾曲線。貝塞爾曲線在計算機圖形學和計算機輔助設計(CAD)中具有廣泛應用,本文將詳細介紹 Geom2d_BezierCurve 類及其使用方法。 貝塞爾曲線簡介 貝塞爾曲線是一種參數曲線,廣泛…

muduo源碼解析

1.對類進行禁止拷貝 class noncopyable {public:noncopyable(const noncopyable&) delete;void operator(const noncopyable&) delete;protected:noncopyable() default;~noncopyable() default; }; 2.日志 使用枚舉定義日志等級 enum LogLevel{TRACE,DEBUG,IN…

互聯網大廠Java面試實錄:Spring Boot與微服務架構在電商場景中的應用解析

&#x1f4aa;&#x1f3fb; 1. Python基礎專欄&#xff0c;基礎知識一網打盡&#xff0c;9.9元買不了吃虧&#xff0c;買不了上當。 Python從入門到精通 &#x1f601; 2. 畢業設計專欄&#xff0c;畢業季咱們不慌忙&#xff0c;幾百款畢業設計等你選。 ?? 3. Python爬蟲專欄…

關于匯編語言與程序設計——單總線溫度采集與顯示的應用

一、實驗要求 (1)握碼管的使用方式 (2)掌握DS18B20溫度傳感器的工作原理 (3)掌握單總線通信方式實現 MCU與DS18B20數據傳輸 二、設計思路 1.整體思路 通過編寫數碼管顯示程序和單總線溫度采集程序&#xff0c;結合溫度傳感報警&#xff0c;利用手指觸碰傳感器&#xff0c;當…

用html+js+css實現的戰略小游戲

效果圖: 兄弟們&#xff0c;話不多說&#xff0c;直接上代碼 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

Navicat BI 數據分析功能上線 | 數據洞察新方法

Navicat 17.2 版本一經發布&#xff0c;便以 AI 助手賦能智能交互、Snowflake 支持拓展數據連接版圖、拓展對關系型、維度以及數據倉庫 2.0 建模方法的支持等新特性與功能抓住了用戶的目光&#xff0c;但其中一項低調且實用的更新 - 在 BI 數據預覽中深度集成數據分析工具&…

【ts】defineProps數組的類型聲明

第一種&#xff1a;使用Record<string, unknown> Record<string, unknown>表示一個對象&#xff0c;鍵是string類型&#xff0c;值是未知的 import { defineProps, PropType } from vue;const props defineProps({dataList: {type: Array as PropType<Record…

OpenCv實戰筆記(4)基于opencv實現ORB特征匹配檢測

一、原理作用 ORB 原理&#xff08;Oriented FAST and Rotated BRIEF&#xff09;&#xff1a; 特征點檢測&#xff1a;使用 FAST 算法檢測角點&#xff08;關鍵點&#xff09;。 方向計算&#xff1a;為每個關鍵點分配主方向&#xff0c;增強旋轉不變性。 特征描述&#xff1a…