C++进程间通信 匿名管道和命名管道

embedded/2024/9/25 21:27:35/

C++进程间通信 匿名管道和命名管道

  • 1. 匿名管道
    • 匿名管道概述
    • 匿名管道代码示例
    • 代码解释
    • 运行结果
  • 2. 命名管道
    • 命名管道概述
    • 命名管道代码示例
      • 写入数据的程序(writer.cpp)
      • 读取数据的程序(reader.cpp)
    • 代码解释
    • 运行步骤
    • 运行结果

匿名管道适用于父子进程之间的简单通信,而命名管道则适用于无亲缘关系的进程之间的通信。

1. 匿名管道

匿名管道概述

匿名管道是用于在具有亲缘关系的进程(如父子进程)之间进行单向通信的简单方式。管道创建时包含两个文件描述符:一个用于读(读端),一个用于写(写端)。

匿名管道代码示例

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <cstring>int main() 
{int pipefd[2];  // 用于保存管道文件描述符pid_t cpid;char buf;if (pipe(pipefd) == -1) {  // 创建管道perror("pipe");exit(EXIT_FAILURE);}cpid = fork();  // 创建子进程if (cpid == -1) {perror("fork");exit(EXIT_FAILURE);}if (cpid == 0) {  // 子进程close(pipefd[1]);  // 关闭写端while (read(pipefd[0], &buf, 1) > 0) {write(STDOUT_FILENO, &buf, 1);  // 读取管道并输出到标准输出}write(STDOUT_FILENO, "\n", 1);close(pipefd[0]);  // 关闭读端_exit(EXIT_SUCCESS);} else {  // 父进程close(pipefd[0]);  // 关闭读端const char *msg = "Hello from parent process!";write(pipefd[1], msg, strlen(msg));  // 写入管道close(pipefd[1]);  // 关闭写端wait(NULL);  // 等待子进程结束exit(EXIT_SUCCESS);}
}

代码解释

  1. 管道创建pipe(pipefd)创建一个匿名管道,其中pipefd[0]是读端,pipefd[1]是写端。
  2. 进程创建fork()创建一个子进程。cpid在子进程中为0,在父进程中为子进程ID。
  3. 子进程
    • 关闭写端。
    • 读取管道数据并输出到标准输出。
    • 关闭读端并退出。
  4. 父进程
    • 关闭读端。
    • 将消息写入管道。
    • 关闭写端并等待子进程结束。

运行结果

Hello from parent process!

2. 命名管道

命名管道概述

命名管道(FIFO)是一种特殊的文件,可以用于无亲缘关系的进程之间进行双向通信。它通过在文件系统中创建一个命名管道文件进行通信。

命名管道代码示例

首先,创建一个命名管道文件:

mkfifo /tmp/myfifo

然后,编写两个程序,一个用于写入数据,另一个用于读取数据。

写入数据的程序(writer.cpp)

#include <iostream>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <cstring>int main() 
{const char *fifo = "/tmp/myfifo";int fd = open(fifo, O_WRONLY);  // 打开命名管道的写端if (fd == -1) {perror("open");exit(EXIT_FAILURE);}const char *msg = "Hello from writer process!";write(fd, msg, strlen(msg));  // 写入数据到命名管道close(fd);  // 关闭管道return 0;
}

读取数据的程序(reader.cpp)

#include <iostream>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <cstring>int main() 
{const char *fifo = "/tmp/myfifo";char buf[128];int fd = open(fifo, O_RDONLY);  // 打开命名管道的读端if (fd == -1) {perror("open");exit(EXIT_FAILURE);}ssize_t numBytes = read(fd, buf, sizeof(buf));  // 从管道读取数据if (numBytes > 0) {buf[numBytes] = '\0';std::cout << "Received message: " << buf << std::endl;  // 输出读取的数据}close(fd);  // 关闭管道return 0;
}

代码解释

  1. 创建命名管道文件:通过mkfifo命令在文件系统中创建一个命名管道文件。
  2. 写入数据的程序(writer.cpp)
    • 打开命名管道的写端。
    • 将消息写入管道。
    • 关闭管道。
  3. 读取数据的程序(reader.cpp)
    • 打开命名管道的读端。
    • 从管道读取数据。
    • 输出读取的数据。
    • 关闭管道。

运行步骤

  1. 在终端中创建命名管道文件:
    mkfifo /tmp/myfifo
    
  2. 分别编译writer.cppreader.cpp
    g++ writer.cpp -o writer
    g++ reader.cpp -o reader
    
  3. 打开两个终端,在第一个终端运行读取程序:
    ./reader
    
  4. 在第二个终端运行写入程序:
    ./writer
    

运行结果

第一个终端(运行读取程序)输出:

Received message: Hello from writer process!

http://www.ppmy.cn/embedded/44028.html

相关文章

markdown语法保存

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

手机版AI写作软件哪个好用?5款AI写作软件分享

在这个快节凑的时代&#xff0c;人们对于高效、便捷的创作方式很是追求。尤其是在人工智能技术发展迅速的今天&#xff0c;AI写作软件的出现&#xff0c;让很多自媒体创作者都会想到在手机上面进内容创作&#xff0c;这样不仅能提高工作效率&#xff0c;而且工作的自由度会更高…

CSP垦田计划

第一次的代码&#xff0c;直接暴力&#xff0c;因为结果的上限就是最大值&#xff0c;下限是k&#xff0c;直接从最大值遍历到k找到答案&#xff1a; #include<bits/stdc.h> using namespace std; const int N 1e510; const int mod 1e97; typedef long long ll; int …

nginx的常用配置与命令相关硬核干货

今天小晨跟大家分享Nginx常用配置与命令相关的硬核干货&#xff0c;可以说运维工作中基本都会用到这些&#xff0c;掌握它&#xff0c;你可以不用求人&#xff01; Nginx特点 高并发、高性能&#xff1b; 模块化架构使得它的扩展性非常好&#xff1b; 异步非阻塞的事件驱动模…

手摸手教你uniapp原生插件开发

行有余力,心无恐惧 这篇技术文章写了得有两三个礼拜,虽然最近各种事情,工作上的生活上的,但是感觉还是有很多时间被浪费.还记得几年前曾经有一段时间7点多起床运动,然后工作学习,看书提升认知.现在我都要佩服那会儿的自己.如果想回到那种状态,我觉得需要有三个重要的条件. 其…

基于Python实现 HR 分析(逻辑回归和基于树的机器学习)【500010104】

介绍 数据集说明 此数据集包含与员工有关的综合属性集合&#xff0c;从人口统计细节到与工作相关的因素。该分析的主要目的是预测员工流动率并辨别导致员工流失的潜在因素。 在这个数据集中&#xff0c;有14,999行&#xff0c;10列&#xff0c;以及这些变量&#xff1a;满意度…

中国交通信息科技集团有限公司(中交信科)java开发工程师-机试题目/颂大技术面试总结/理工数传 软件开发一面二面面试总结/武汉智能视觉信息技术有限公司/高级

武汉智能视觉信息技术有限公司/高级 如果解决jvm内存溢出如果解决亿级别的数据导出,有没有其他的方案可以解决呢索引的原理工作中用了哪些索引提高了多少的速度线程池的创建方法--解释new ThreadPool的其他参数以及四大拒绝策略分布式使用用到了哪些模式xxl-job的原理作为管理…

JWT令牌

目录 介绍 JWT的组成 应用场景-登录认证 介绍 JWT&#xff0c;全称&#xff1a;JSON Web Token 定义了一种简洁的、自包含的格式&#xff0c;用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在&#xff0c;这些信息是可靠的 JWT就是将原始的json数据格式进…