匿名管道和命名管道

管道是进程通信的一种方式。(进程通信需要让不同进程看到同一份资源

管道分为匿名管道和命名管道两种。

管道只允许单向通信。

一.匿名管道

#include<iostream>
#include <unistd.h>
#include<cassert>
#include<cstring>
#include<errno.h>
#include<string>
#include <sys/types.h>
#include <sys/wait.h>//父写子读
int main()
{
//父进程创建管道int pipefd[2] = {0};int n = pipe(pipefd);assert(n == 0);(void*)n;std::cout << "pipefd[0]" << pipefd[0] << "pipefd[1]" << pipefd[1] << std::endl;//创建子进程pid_t id = fork();if(id < 0){perror("fork false\n");return 1;}if(id == 0) //子进程读{close(pipefd[1]); //关闭写//to dowhile(true){char ret[100];ssize_t n = read(pipefd[0], ret, sizeof(ret) - 1);if(n > 0){ret[n] = '\0';std::cout << "child read:" << ret << std::endl;}else if(n == 0)//代表read读不到内容时返回0{break;}}//关闭所有fdclose(pipefd[0]);exit(0);}//父进程close(pipefd[0]); //关闭读//to dostd::string s = "i am father";write(pipefd[1], s.c_str(), strlen(s.c_str()));sleep(5);//关闭所有fdclose(pipefd[1]);//回收子进程pid_t rid = waitpid(id, nullptr, 0);if(rid == id){std::cout << "wait success" << std::endl;}return 0;
}

 

 

二.命名管道

1.命令行创建命名管道

【】$ mkfifo filename

2.代码创建


 

A写B读 

#include<iostream>
#include<cassert>
#include<cstring>
#include<errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>//A写  B读
int main()
{
//创建命名管道int n = mkfifo("fifo", 0666);if(n < 0){perror("mkfifo false\n");return 1;}int fd = open("fifo", O_WRONLY);if(fd < 0){perror("open fail\n");return 1;}//写入内容std::string ms = "i am process A";write(fd, ms.c_str(), ms.size());close(fd);return 0;
}

 

#include<iostream>
#include<cassert>
#include<cstring>
#include<errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{int fd = open("fifo", O_RDONLY);if(fd < 0){perror("open fail\n");return 1;}
//读取内容char ret[1024];while(true){ssize_t n = read(fd, ret, sizeof(ret) - 1);if(n > 0){ret[n] = '\0';std::cout << "B read :" << ret << std::endl;}else if(n == 0){break;}}close(fd);return 0;
}

三.管道4种情况,5种特性

a.5种特性:

1.匿名管道,只允许具有血缘关系的进程之间进行通信,常用于父子;

命名管道,任意进程。

2.管道默认给读写端提供同步机制

3.面向字节流的

4.管道的生命周期是随进程的

5.管道是单向通信的(一个进程读,另一进程写)

 b.4种情况

1.如果管道没有数据了,读端必须等待,直到有数据为止(写端写数据)。

2.如果管道被写满了,写端必须等待,直到有空间为止(读端读走数据)

3.写端关闭,读端一直读取,读端会读到read返回值为0,表示文件结尾

4.读端关闭,写端一直写,os会直接杀掉写端进程,通过向目标进程发送SIGPIPE(13)信号,终止目标进程。

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

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

相关文章

小白水平理解面试经典题目LeetCode 455 Assign Cookies【Java实现】

455 分配cookies 小白渣翻译&#xff1a; 假设你是一位很棒的父母&#xff0c;想给你的孩子一些饼干。但是&#xff0c;你最多应该给每个孩子一块饼干。 每个孩子 i 都有一个贪婪因子 g[i] &#xff0c;这是孩子满意的 cookie 的最小大小&#xff1b;每个 cookie j 都有一个…

SOME/IP SD 协议介绍(三)服务发现消息

服务发现消息 使用先前指定的头部格式&#xff0c;可以构建不同的条目和由一个或多个条目组成的消息。具体的条目和它们的头部布局在下面的章节中进行解释。 对于所有的条目&#xff0c;应满足以下条件&#xff1a; • Index First Option Run、Index Second Option Run、Nu…

260:vue+openlayers 通过webgl方式加载矢量图层

第260个 点击查看专栏目录 本示例介绍如何在vue+openlayers中通过webgl方式加载矢量图层。在做这个示例的时候,采用vite的方式而非webpack的方式。这里的基础设置需要改变一下。 ol的版本7.5.2或者更高。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文…

Git安装,Git镜像,Git已安装但无法使用解决经验

git下载地址&#xff1a; Git - 下载 (git-scm.com) <-git官方资源 Git for Windows (github.com) <-github资源 CNPM Binaries Mirror (npmmirror.com) <-阿里镜像&#xff08;推荐&#xff0c;镜…

防御保护笔记02

防火墙 防火墙的主要职责在于&#xff1a;控制和防护 ---- 安全策略 --- 防火墙可以根据安全策略来抓取流量 防火墙分类 按物理特性划分 软件防火墙 硬件防火墙 按性能划分 百兆级防火墙 吞吐量&#xff1a;指对网络、设备、端口、虚电路或其他设施&#xff0c;单位时间内成…

数学公式OCR识别php 对接mathpix api 使用公式编译器

数学公式OCR识别php 对接mathpix api 一、注册账号官网网址&#xff1a;https://mathpix.com 二、该产品支持多端使用注意说明&#xff08;每月10次&#xff09; 三、api 对接第一步创建create keyphp对接api这里先封装两个请求函数&#xff0c;get 和post &#xff0c;通过官方…

Python 数据分析实战——社交游戏的用户流失?酒卷隆治_案例2

# 什么样的顾客会选择离开 # 数据集 DAU : 每天至少来访问一次的用户数据 数据内容 数据类型 字段名 访问时间 string&#xff08;字符串&#xff09; log_data 应用名称 string&#xff08;字符串&#xff09; app_name 用户 ID int&#xff08;数值&#xff09; user_id…

1_Matlab基本操作

文章目录 工作环境操作界面运行命令窗口使用历史窗口当前目录浏览器工作空间浏览器帮助系统 工作环境 操作界面 命令窗口&#xff1a;用户进行操作的主要窗口。可以输入各种MATLAB的命令。函数和表达式。同时操作的运算结构也会在该窗口出现。历史命令窗口&#xff1a;记录用户…

Linux之系统安全与应用续章

一. PAM认证 1.2 初识PAM PAM是Linux系统可插拔认证模块。 1.2.1 PAM及其作用 1&#xff09;PAM是一种高效且灵活便利的用户级别认证方式&#xff0c;也是当前Linux服务器普遍使用的认证方式。 2&#xff09;PAM提供了对所有服务进行认证的中央机制&#xff0c;适用于本地…

【Flutter 面试题】Dart是什么?Dart和Flutter有什么关系?

【Flutter 面试题】Dart是什么&#xff1f;Dart和Flutter有什么关系&#xff1f; 文章目录 写在前面Dart是什么Dart和Flutter有什么关系&#xff1f; 写在前面 &#x1f44f;&#x1f3fb; 正在学 Flutter 的同学&#xff0c;你好&#xff01; &#x1f60a; 本专栏是解决 Fl…

京东广告算法架构体系建设--在线模型系统分布式异构计算演变 | 京东零售广告技术团队

一、现状介绍 算法策略在广告行业中起着重要的作用&#xff0c;它可以帮助广告主和广告平台更好地理解用户行为和兴趣&#xff0c;从而优化广告投放策略&#xff0c;提高广告点击率和转化率。模型系统作为承载算法策略的载体&#xff0c;目前承载搜索、推荐、首焦、站外等众多广…

第16章_网络编程(网络通信要素,TCP与UDP协议,网络编程API,TCP网络编程,UDP网络编程,URL编程)

文章目录 第16章_网络编程本章专题与脉络1. 网络编程概述1.1 软件架构1.2 网络基础 2. 网络通信要素2.1 如何实现网络中的主机互相通信2.2 通信要素一&#xff1a;IP地址和域名2.2.1 IP地址2.2.2 域名 2.3 通信要素二&#xff1a;端口号2.4 通信要素三&#xff1a;网络通信协议…