Linux多进程通信(1)——无名管道及有名管道使用例程

管道是半双工通信,如果需要 双向通信,则需要建立两个管道,
无名管道:只能父子进程间通信,且是非永久性管道通信结构,当它访问的进程全部终止时,管道也随之被撤销
有名管道:进程间不需要有亲缘关系,是永久性管道通信结构,直到pclose才被关闭。(提供了一个路径名,以FIFO的形式存在于文件系统)

1.有名管道

int mkfifo(const char *pathname, mode_t mode);

有名管道创建完毕后,直接使用系统调用来操作即可进行读写等操作,同时也可以使用mkfifo(shell命令),来进行管道创建
打开管道:open
关闭管道:close
读数据:read
写数据:write

2.无名管道

2.1 pipe

pipefd为数组指针,传出的fd[0]为读管道,fd[1]为写管道
写端需要关闭读管道,也就是fd[0],读端需要 关闭写通道,也就是fd[1]

#include <unistd.h>
int pipe(int pipefd[2]);

在这个例子中,创建管道1、管道2后,进行fork操作。在父进程中,关闭管道1的读管道,关闭管道2的写管道。在子进程中则相反,最终达到管道1,父写子读,管道2,父读子写的效果

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LINE 1024int main(int argc, char **argv)
{int fd1[2], fd2[2];pid_t pid;int num;char buf[LINE];if (pipe(fd1) < 0) {printf("pipe fd1 error\n");return -1;}if (pipe(fd2) < 0) {printf("pipe fd2 error\n");return -1;}printf("prepare fork\n");pid = fork();if (pid < 0) {printf("fork error\n");} else if (pid > 0) {printf("prepare fork1\n");//父进程:返回子进程IDclose(fd1[0]);  //管道1,父写子读。 管道2,父读子写close(fd2[1]); char *str = "hello, this data is parent write by pipe1\n";write(fd1[1], str, strlen(str));num = read(fd2[0], buf, LINE);write(STDOUT_FILENO, buf, num);} else {printf("prepare fork2\n");//子进程:返回0close(fd1[1]);  //管道1,父写子读。 管道2,父读子写close(fd2[0]);num = read(fd1[0], buf, LINE);write(STDOUT_FILENO, buf, num);char *str2 = "hello, this data is child write by pipe2\n";write(fd2[1], str2, strlen(str2));}exit(0);
}

最终输出如下:
image.png

2.2 基于pipe的popen

常用的popen和pclose,其实就是基于无名管道进行的封装,感兴趣的可以看下源码,libc的各个版本有细微差异,但总体思路是一致的,然后工作中也经常用到popen封装的接口。相比system这个方式要更为安全,可以看另外一篇博客:

FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);

在使用popen后,不用管道时要调用pclose将管道关闭

2.3 自己实现的基于popen读取命令输出函数

bool LinuxPopenExecCmd(std::string &strOutData, const char * pFormat, ...)
{char acBuff[128] ={0};va_list ap;int ret = -1;va_start(ap, pFormat);ret = vsprintf(acBuff, pFormat, ap);va_end(ap);FILE *pFile = popen(acBuff, "r");if (NULL == pFile){return false;}char acValue[1024] = {0};while(fgets(acValue, sizeof(acValue), pFile) != NULL){strOutData += acValue;}pclose(pFile);return true;
}
// 使用时直接这样使用即可,非常方便,并且支持格式化输入命令
std::string strValue;
LinuxPopenExecCmd(strValue, "ls -l"):
LinuxPopenExecCmd(strValue, "ls -l %s", "/tmp/"):

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/787354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RK3568驱动指南|第十四篇 单总线-第162章DS18B20驱动读时序编写

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

秒验资深玩家熬夜整理的15个常见问题,拿走不谢!

1、双卡双待手机如何登录&#xff1f; 针对双卡双待手机只取当前流量卡号 2、用其他手机号如何登录&#xff1f; 使用传统验证方式登录&#xff0c;例如验证码登录 3、一键登录只支持4G吗&#xff1f; 电信支持4G,5G网络取号&#xff0c;移动, 联通支持5G,4G, 3G, 2G网络取号…

数值金额计算js封装包含加减乘除四个方法,能确保浮点数运算不丢失精度

项目场景&#xff1a; 商城类项目中大多需要金额计算&#xff0c;我们知道计算机编程语言里浮点数计算会存在精度丢失问题&#xff08;或称舍入误差&#xff09;&#xff0c;其根本原因是二进制和实现位数限制有些数无法有限表示 以下是十进制小数对应的二进制表示&#xff1…

python笔记(8)Tuple(元组)

目录 创建元组 元组取数 不支持修改和删除元素 元组运算符 元组内置函数 创建元组 Tuple 元组的元素不能修改&#xff0c;元组使用小括号&#xff08;&#xff09;&#xff0c;创建元组在括号里添加元素用逗号隔开即可。 创建空元组 tup1() 创建一个元素的元组&#xff…

Golang 开发实战day06 - Boolean Conditional

Golang 教程06 - Boolean & Conditional 1. Boolean & Conditional 1.1 什么是布尔类型&#xff1f; 想象一下&#xff0c;你正在玩一个古老的游戏&#xff0c;只有两个选项&#xff1a;是或否。在 Golang 中&#xff0c;这就是布尔类型&#xff0c;用 bool 关键字表…

【Linux实验室】DNS域名解析服务——超详细实验操作!

DNS域名解析 DNS域名解析服务——超详细实验操作&#xff01;&#xff01;&#xff01;序言DNS 基本概述分布式、层次数据库DNS 层次结构DNS 查询步骤DNS 查询类型DNS服务器类型DNS 缓存反向 DNS 查询如何检查 DNS 记录是否生效 Bind解析服务Bind简介bind的服务类型 DNS域名解析…

深入解析实时数仓Doris:Rollup上卷表与查询

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 一、基本概念二、Aggregate 和 Unique 模型中的 ROLLUP三、Duplicate 模型中的 ROLLUP四、ROLLUP 调整前缀索引五、ROLLUP使…

【深耕 Python】Data Science with Python 数据科学(7)书352页练习题

写在前面 关于数据科学环境的建立&#xff0c;可以参考我的博客&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;1&#xff09;环境搭建 往期数据科学博文&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;2&#xf…

Android 使用LeakCanary检测内存泄漏,分析原因

内存泄漏是指无用对象&#xff08;不再使用的对象&#xff09;持续占有内存或无用对象的内存得不到及时释放&#xff0c;从而造成内存空间的浪费称为内存泄漏。 平时我们在使用app时&#xff0c;少量的内存泄漏我们是发现不了的&#xff0c;但是当内存泄漏达到一定数量时&…

每日面经分享(pytest测试案例,接口断言,多并发断言)

pytest对用户登录接口进行自动化脚本设计 a. 创建一个名为"test_login.py"的测试文件&#xff0c;编写以下测试脚本 import pytest import requests# 测试用例1&#xff1a;验证登录成功的情况 # 第一个测试用例验证登录成功的情况&#xff0c;发送有效的用户名和密…

统计数码出现的个数

题目描述 输入一个数n&#xff0c;求出 [1, n] 中每个数码出现的次数&#xff0c;即0 - 9每个数出现的次数。 解题思路 首先是无情的暴力法&#xff0c;可以用于判断我们后续的优化代码是否正确。 import java.io.*; import java.util.*;public class Main1 {static int n;p…

iOS系统文件备份与还原:保护和管理手机中的关键数据

​ 目录 引言 用户登录工具和连接设备 查看设备信息&#xff0c;电池信息 查看硬盘信息 硬件信息 查看 基带信息 销售信息 电脑可对手机应用程序批量操作 运行APP和查看APP日志 IPA包安装测试 注意事项 引言 苹果手机与安卓手机不同&#xff0c;无法直接访问系统文件…

Chatgpt掘金之旅—有爱AI商业实战篇|文案写作|(三)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、前言 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随着AI技术的快速发展和应用领域的不断拓展&…

#设计模式#4.6 Flyweight(享元) 对象结构型模式

享元模式是一种结构型设计模式&#xff0c;其主要目标是通过共享大量细粒度的对象来节省内存。享元模式的关键在于区分内部状态&#xff08;Intrinsic State&#xff09;和外部状态&#xff08;Extrinsic State&#xff09;。 内部状态是对象可共享的部分&#xff0c;通常是对…

是否应该升级到ChatGPT 4.0?深度对比ChatGPT 3.5与4.0的差异

如果只是想简单地体验AI的魅力&#xff0c;感受大模型的独特之处&#xff0c;或是玩一玩文字游戏&#xff0c;那么升级至ChatGPT 4.0可能并非必需。然而&#xff0c;若你期望将AI作为提升工作学习效率的得力助手&#xff0c;那么我强烈建议你升级到ChatGPT 4.0。 如果你不知道…

Linux和Windows安装PHP依赖管理工具Composer

Composer 是 PHP 的一个依赖管理工具。它允许申明项目所依赖的代码库&#xff0c;会在项目中安装它们。 Composer 不是一个包管理器。是的&#xff0c;它涉及 "packages" 和 "libraries"&#xff0c;但它在每个项目的基础上进行管理&#xff0c;在你项目的…

【Springboot整合系列】SpringBoot整合WebService

目录 Web服务介绍Web服务的两种类型Web服务架构Web服务的主要特点Web服务使用场景Web服务标准和技术 WebService介绍WebService的作用适用场景不适用场景 WebService的原理三个角色相关概念 WebService开发框架代码实现服务端1.引入依赖2.实体类3.业务层接口接口实现类 4.配置类…

python对接百度云车牌识别

注册百度智能云&#xff0c;选择产品服务。 https://console.bce.baidu.com/ 每天赠送200次&#xff0c;做开发测试足够了。 在应用列表复制 AppID , API Key ,Secret Key 备用。 SDK下载地址 https://ai.baidu.com/sdk#ocr 下载SDK文件&#xff0c;解压&#xff0c;…

matlab中旋转矩阵函数

文章目录 matlab里的旋转矩阵、四元数、欧拉角四元数根据两向量计算向量之间的旋转矩阵和四元数欧拉角转旋转矩阵旋转矩阵转欧拉角旋转矩阵转四元数参考链接 matlab里的旋转矩阵、四元数、欧拉角 旋转矩阵dcmR四元数quatq[q0,q1,q2,q3]欧拉角angle[row,pitch,yaw] % 旋转矩阵…

前端跨页面通信方案介绍

在浏览器中&#xff0c;我们可以同时打开多个Tab页&#xff0c;每个Tab页可以粗略理解为一个“独立”的运行环境&#xff0c;即使是全局对象也不会在多个Tab间共享。然而有些时候&#xff0c;我们希望能在这些“独立”的Tab页面之间同步页面的数据、信息或状态。这就是本文说说…