当前位置: 首页 > news >正文

贵阳网站建设王道下拉惠/网络营销产品策略的内容

贵阳网站建设王道下拉惠,网络营销产品策略的内容,自助建站网站建设,phpnow超详细WordPress目录 为什么要进行进程间通信? 匿名管道的具体实现 pipe创建内存级文件形成管道 pipe的简单使用 匿名管道的四种情况和五种特性 四种情况 五种特性 PIPE_BUF 命令行管道 | 功能代码:创建进程池 为什么要进行进程间通信? 1.数据传输&…

目录

为什么要进行进程间通信?

匿名管道的具体实现

pipe创建内存级文件形成管道

pipe的简单使用

匿名管道的四种情况和五种特性

四种情况

五种特性

PIPE_BUF

命令行管道 |

功能代码:创建进程池


为什么要进行进程间通信?

1.数据传输:一个进程需要将它的数据发送给另一个进程,比如我们有两个进程,一个负责获取数据,另一个负责处理数据,这时第一个进程就要将获取到的数据交给第二个进程

2.资源共享:多个进程间共享同样的资源

3.通知事件:一个进程需要给其他进程发送消息,通知他们发生了某种事件

4.进程控制:有些事件需要完全控制另一个进程,比如我们在使用gdb调试时,gdb就是一个进程,它控制了我们要调试的进程

进程之前是有互相传递信息的需求,但是进程之间又是独立的,一个进程不可能去另一个进程的地址空间中取信息,所以这就要求操作系统去提供一块交换数据的空间来供进程之间使用

OS提供空间有不同的样式,这就有了不同的通信方式

1.管道(分为匿名和命名)

2.共享内存

3.消息队列

4.信号量

那么我们就先来谈一谈匿名管道

匿名管道的具体实现

在谈之前,我们要有一些之前的知识作为理论基础,就是父进程创建子进程PCB和文件描述符表是要拷贝一份的,并且里边的值不会进行修改,就相当于浅拷贝;而管理文件的结构体对象不会拷贝。因为前者是跟进程相关的,而后者是跟文件系统相关的。我们把这段话用图来描述就是这样的:

通过这样的操作父子进程就可以看到同一块文件的缓冲区了,这样进程就可以读写了,但是两个文件由读又写容易发生混乱,所以我们一般关掉一个进程的读端,关掉另一个进程的写端,这样就实现了单向通信,就是因为它是单向通信,就像管道一样,所以这样的通信方式就被命名为管道。

pipe创建内存级文件形成管道

我们上面的操作是基于一个实实在在的磁盘文件的,我们必须得这样吗?肯定不是的,OS就提供了一个系统调用负责提供一个内存级的文件它没有名字,只能通过文件描述符来访问,这个系统调用叫pipe()

它的参数是一个输出型参数,就是pipe这个函数把内存级文件的读写文件描述符放到这个数组中,我们来取来用。

并且,规定0下标放的是r方法,1下标放的是w方法

由上面我们可以看出,匿名管道是只能具有血缘关系的进程之间使用,因为文件描述符表是要靠父进程创建子进程拷贝下来的。

pipe的简单使用

那么下面我们就写一段代码来验证上面所说的内容,并且演示管道究竟应该如何使用,下面的代码就是子进程往管道里写,父进程往管道里读

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
void writer(int wfd)
{const char *str = "i am child,this is the ";int cnt = 0;char buffer[128] = {0};while (1){snprintf(buffer, sizeof(buffer), "%s%d message", str, cnt);write(wfd, buffer, strlen(buffer));sleep(1);cnt++;}
}
void reader(int rfd)
{while (1){char buffer[1024] = {0};read(rfd, buffer, sizeof(buffer));printf("I am father,I get a message:%s\n", buffer);}
}int main()
{int pipefd[2] = {0};int n = pipe(pipefd);if (n < 0)return 1;pid_t id = fork();if (id == 0){// 子进程负责wclose(pipefd[0]);writer(pipefd[1]);exit(0);}// 父进程负责rclose(pipefd[1]);reader(pipefd[0]);return 0;
}

匿名管道的四种情况和五种特性

有了上面的一些基本使用,下面我们来演示一下管道的四种情况以及说明五种特性

四种情况

第一种:管道中没有数据,并且子进程不关闭自己的写端,这时父进程会进行阻塞等待,直到管道中有数据

第二种:子进程一直写,父进程不读,但是父进程不关闭读端,当管道被写满时就要进行阻塞等待,直到管道中的数据被读出去才会继续写

我们就让子进程一次写一个字符,看看它一共能写多少个字符

这里printf如果不给换行的话一定要fflush,否则有的打印的东西会在缓冲区中打印不出来

我们可以看到最终是打印到了65536byte,正好是64kb,我们就可以推断出管道的大小是64kb

第三种:子进程不写了并且关掉了写端,这时读端读完了管道中的数据后,read的返回值就为0,这时我们就可以人为的退出了,这和第一种情况是不同的第一种情况是阻塞等待

我们让子进程写10秒就退出,read返回值为0父进程就退出

第四种:让写端一直写,但是读端不读并且关闭读端,这时的结果就是写端也会退出,因为没人读了写就没意义了。

至于说写端是如何退出的呢?其实是收到了退出信号,我们也可以通过wait的方式来看一下退出信号是什么

我们让写端一直写,读端读5秒后退出,然后通过wait的方式获取子进程(写端)的退出信号

五种特性

通过上面的一些介绍,我们就可以总结出管道的五种特性

1.自带同步机制:写满了就不写了,等待读,等待它们之间的同步,读不到就不读了,等待写

2.具有血缘关系的进程间进行通信

3.pipe是面向字节流的:我可以一个字符一个字符的写,同时可以一下读很多个字节,就是说读的次数和写的次数之间是没有关系的,它们是面向管道中的数据的

4.进程退出,管道自动释放,文件的生命周期是随着进程的

5.管道只能单向通信,就是一个写,一个读,这也叫半双工

PIPE_BUF

PIPE_BUF是一个常量,它是由大小的

就是说:每次写入管道的字节数如果小于这个值,那么就认为本次写入是原子的(安全的),就是保证内容是完整的,不会被分割

命令行管道 |

之前我们说的命令 | ,本质上就是这篇博客说的pipe

比如 

就是同时创建三个进程,两个进程之间创建好管道,第一个进程的输出当作第二个进程的输入,第二个进程的输出当作第三个进程的输入,最终效果是睡眠三秒

功能代码:创建进程池

进程池就是一次创建多个进程,然后父进程负责分发任务给各个子进程各个子进程处理完一个任务后还可以处理下一个任务,而不需要创建新的进程,这样就减少了创建和销毁进程的开销。

我们之前写bash的时候就是有一个任务bash就创建子进程,然后子进程进行进程程序替换,执行完后就退出了。

我们今天写的呢就是创建子进程后子进程一直等待父进程的命令然后执行任务,执行完任务后继续等待。

//task.hpp
#include <iostream>
#include <unistd.h>
#include <cstring>
#include <cerrno>
#include <cstdlib>
#include <vector>
#include<ctime>
using namespace std;typedef void(*task)();
void task1()
{cout<<"do task one successfully"<<endl;
}
void task2()
{cout<<"do task two successfully"<<endl;
}void task3()
{cout<<"do task three successfully"<<endl;
}
task tasks[3]={task1,task2,task3};//processpool.cc
#include "task.hpp"void Usage(char *argv)
{cout << "please input : " << argv << " and processnum\n";
}
enum error
{USAGE_failed = 1,PIPE_failed,
};class channel
{
public:channel(int wfd, int id, int n): _wfd(wfd), _id(id), _name("channel-" + to_string(n)){}void print(){cout << "name is " << _name << "id is " << _id << "  wfd is " << _wfd << endl;}int wfd(){return _wfd;}~channel() {}private:int _wfd;pid_t _id;string _name;
};class processpool
{
public:processpool(int size): _size(size){for (int i = 1; i <= size; i++){int pipefd[2] = {0};int ret = pipe(pipefd);if (ret == -1){cout << "pipe failed : errno is " << errno << "error describe is " << strerror(errno) << endl;exit(PIPE_failed);}pid_t id = fork();if (id == 0){// 子进程for (int j = pipefd[0] + 1; j <= pipefd[1]; j++){close(j);}// 等待任务while (1){int buffer = 0;int n = read(pipefd[0], &buffer, sizeof(buffer));if (n != 0){cout << "child" << i << " " << getpid() << " "; tasks[buffer]();//执行任务}if (n == 0)break;}exit(0);}channels.push_back({pipefd[1], id, i});close(pipefd[0]);}}void print(){for (auto &e : channels){e.print();}}void get_wfd(vector<int> &f){for (auto &e : channels){f.push_back(e.wfd());}}private:vector<channel> channels;int _size;
};
void give_task(vector<int> &wfd)
{int n = wfd.size();for (int i = 0; i < 100; i++){int tasknum = rand() % (sizeof(tasks) / sizeof(tasks[0]));write(wfd[i % n], &tasknum, sizeof(tasknum));//按顺序选择管道,派发随机任务sleep(1);}
}int main(int argc, char *argv[])
{srand((unsigned int)time(nullptr));if (argc != 2){Usage(argv[0]);return USAGE_failed;}int processnum = stoi(argv[1]);processpool pool(processnum);//创建进程池vector<int> wfd;pool.get_wfd(wfd);//都可以去给哪个文件描述符给任务give_task(wfd);//发送任务return 0;
}

相关文章:

【Linux】进程间通信——匿名管道

目录 为什么要进行进程间通信&#xff1f; 匿名管道的具体实现 pipe创建内存级文件形成管道 pipe的简单使用 匿名管道的四种情况和五种特性 四种情况 五种特性 PIPE_BUF 命令行管道 | 功能代码&#xff1a;创建进程池 为什么要进行进程间通信&#xff1f; 1.数据传输&…...

React Native与React Native Web:跨平台开发的新选择

React Native和React Native Web是两种基于React框架的跨平台开发技术&#xff0c;它们分别针对原生移动应用和Web应用的开发&#xff0c;但都提供了统一的开发体验和代码复用能力。 React Native 概述 React Native允许开发者使用React的组件化思想和JavaScript编写原生级别…...

【从零开始实现stm32无刷电机FOC】【理论】【3/6 位置、速度、电流控制】

目录 PID控制滤波单独位置控制单独速度控制单独电流控制位置-速度-电流串级控制 上一节&#xff0c;通过对SVPWM的推导&#xff0c;我们获得了控制电机转子任意受力的能力。本节&#xff0c;我们选用上节得到的转子dq轴解耦的SVPWM形式&#xff0c;对转子受力进行合理控制&…...

使用MySQLInstaller配置MySQL

操作步骤 1.配置High Availability 默认选项Standalone MySQL Server classic MySQL Replication 2.配置Type and Networking ◆端口默认启用TCP/P网络 ◆端口默认为3306 3.配置Account and Roles 设置root账户的密码、添加其他管理员 4.配置Windows Service ◆配置MySQL Serv…...

命令执行(RCE)面对各种过滤,骚姿势绕过总结

1、什么是RCE RCE又称远程代码执行漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入操作系统命令或者代码&#xff0c;从而控制后台系统。 2、RCE产生原因 服务器没有对执行命令的函数做严格的过滤&#xff0c;最终导致命令被执行。 3、命令执行函数 PHP代码执行函数…...

复杂的数仓项目,涵盖了从数据采集、处理、存储到可视化的整个流程

一个复杂的数仓项目&#xff0c;涵盖了从数据采集、处理、存储到可视化的整个流程。以下是对您提供信息的梳理和解释&#xff1a; 1. **项目架构**&#xff1a; - 包含实时流、离线流和配置流三条数据流。 - 数据源使用MySQL&#xff0c;开启binlog日志。 2. **数据采集…...

三相感应电机的建模仿真(3)基于ABC相坐标系Level2 S-Fun以及定子串不对称电抗起动过程仿真分析

1. 概述 2. 三相感应电动机状态方程式 3. 基于Level2 S-Function的仿真模型建立 4. 动态分析实例 5. 总结 6. 参考文献 1. 概述 三相感应电机自然坐标系下的数学模型是一组周期性变系数微分方程(其电感矩阵是转子位置角的函数,转子位置角随时间按正弦规律变化),将其用…...

了解Adam和RMSprop优化算法

优化算法是机器学习和深度学习模型训练中至关重要的部分。本文将详细介绍Adam&#xff08;Adaptive Moment Estimation&#xff09;和RMSprop&#xff08;Root Mean Square Propagation&#xff09;这两种常用的优化算法&#xff0c;包括它们的原理、公式和具体代码示例。 RMS…...

对于配置LLM,集显和独显的具体区别和影响

在配置大型语言模型&#xff08;LLM&#xff09;时&#xff0c;集成显卡&#xff08;集显&#xff09;和独立显卡&#xff08;独显&#xff09;之间的区别和影响主要体现在以下几个方面&#xff1a; 1. 性能差异 集成显卡&#xff08;集显&#xff09;&#xff1a; 集显通常集…...

uniapp上架到appstore遇到的问题

1、appstore在美国审核&#xff0c;需要把服务器接口的国外访问权限放开 2、登陆部分 a、审核时只能有密码登陆&#xff0c;可以通过接口响应参数将其他登陆方式暂时隐藏&#xff0c;审核成功后放开即可 b、需要有账号注销功能 3、使用照相机和相册功能时需要写清楚描述文案...

每天10个vue面试题(一)

1. Vue的基本原理&#xff1f; 当一个Vue实例创建时&#xff0c;Vue会遍历data中的属性&#xff0c;用Object.defineProperty&#xff08;vue3.0使用proxy &#xff09;将它们转为 getter/setter&#xff0c;并且在内部追踪相关依赖&#xff0c;在属性被访问和修改时通知变化。…...

【博主推荐】HTML5好看的酷酷的个人简历、个人主页、个人网站源码

文章目录 1.设计来源1.1 主界面1.2 关于我界面1.3 我的项目界面1.4 我的经验界面1.5 我的技能界面1.6 我的文章界面1.7 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeig…...

【深度学习】PyTorch深度学习笔记01-Overview

参考学习&#xff1a;B站视频【《PyTorch深度学习实践》完结合集】-刘二大人 ------------------------------------------------------------------------------------------------------- 1. 基于规则的深度学习 2. 经典的机器学习——手动提取一些简单的特征 3. 表示学习…...

IDEA新建项目并撰写Java代码的方法

本文介绍在IntelliJ IDEA软件中&#xff0c;新建项目或打开已有项目&#xff0c;并撰写Java代码的具体方法&#xff1b;Groovy等语言的代码也可以基于这种方法来撰写。 在之前的文章IntelliJ IDEA社区版在Windows电脑中的下载、安装方法&#xff08;https://blog.csdn.net/zheb…...

24-7-9-读书笔记(九)-《爱与生的苦恼》[德]叔本华 [译]金玲

文章目录 《爱与生的苦恼》阅读笔记记录总结 《爱与生的苦恼》 《爱与生的苦恼》叔本华大佬的名书&#xff0c;里面有其“臭名昭著”的《论女人》&#xff0c;抛开这篇其他的还是挺不错的&#xff0c;哲学我也是一知半解&#xff0c;这里看得也凭喜好&#xff0c;这里记录一些自…...

uniapp本地打包到Android Studio生成APK文件

&#xff08;1&#xff09;安装 Android Studio 软件&#xff1b; 下载地址&#xff1a;官方下载地址&#xff0c;英文环境 安装&#xff1a;如下之外&#xff0c;其他一键 next &#xff08;2&#xff09;配置java环境&#xff1b; 下载&#xff1a;j…...

如何设计一个高可扩展的分布式架构?

如何设计一个高可扩展的分布式架构&#xff1f; 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 引言&#xff1a;分布式架构的重要性 随着互联网应用的发展&#xff0c;单一服务器往往难以满足…...

大话C语言:第28篇 内存分配与释放

1 malloc函数 函数说明&#xff1a; #include <stdlib.h>void *malloc(size_t size); 功能&#xff1a;在内存的动态存储区(堆区)中分配一块长度为size字节的连续区域&#xff0c;用来存放类型说明符指定的类型。分配的内存空间内容不确定。 参数&#xff1a;size&…...

第一个基于FISCOBCOS的前后端项目(发行转账)

本文旨在介绍一个简单的基于fiscobcos的前后端网站应用。Springbootjs前后端不分离。 所使用到的合约也是一个最基本的。首先您需要知道的是完整项目分为三部分&#xff0c;1是区块链平台webase搭建&#xff08;此项目使用节点前置webase-front即可&#xff09;&#xff0c;2是…...

python采集阿里巴巴历年员工人数统计报告

数据为2012到2022财年阿里巴巴每年的全职员工数量。截止2022年3月31日&#xff0c;阿里巴巴共有全职员工254941人&#xff0c;比上年增长3479人。 数据来源于阿里巴巴20-F和F-1文件 按阿里巴巴财政年度进行统计&#xff0c;阿里巴巴财年结束日期为每年3月31日 为全职员工人数 阿…...

git 基础场景操作

git基于当前分支创建分支&#xff0c;合并分支 git checkout -b new-batch git push origin new-batch git branch --set-upstream-toorigin/new-batch git pull git checkout master git merge origin new-batch git 开发分支合并 描述&#xff1a; git 我有 develop …...

代码随想录-DAY④-链表——leetcode 24 | 19 | 142

24 思路 如果 pre 的后面没有节点或者只有一个节点&#xff0c;则没有更多的节点需要交换, 否则&#xff0c;通过更新节点的指针关系交换 pre 后面的两个节点&#xff0c; 最后&#xff0c;返回新的链表的头节点 dummyhead->next。 时间复杂度&#xff1a;O(n) 空间复杂…...

ORA-12537: TNS:连接关闭/Io 异常: Got minus one from a read call

在另外一个数据库建立dblink的时候&#xff0c;发现执行命令报错&#xff1a; 被连接的数据库我也上去过&#xff0c;用工具尝试登陆也报错&#xff1a; IO Error: Got minus one from a read call, connect lapse 1 ms., Authentication lapse 0 ms. Got minus one from a …...

【Python】一文向您详细介绍 np.inner()

【Python】一文向您详细介绍 np.inner() 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&#xff0c;曾…...

pdf分割,这几款软件轻松搞定PDF拆分

在数字化办公日益普及的今天&#xff0c;PDF文件因其跨平台、不易修改的特性&#xff0c;成为了我们日常工作中不可或缺的一部分。然而&#xff0c;面对庞大的PDF文件&#xff0c;如何高效、准确地将其分割成多个小文件&#xff0c;以便更好地管理和使用&#xff0c;成为了许多…...

【吊打面试官系列-MyBatis面试题】什么是 MyBatis 的接口绑定?有哪些实现方式?

大家好&#xff0c;我是锋哥。今天分享关于 【什么是 MyBatis 的接口绑定&#xff1f;有哪些实现方式&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 什么是 MyBatis 的接口绑定&#xff1f;有哪些实现方式&#xff1f; 接口绑定&#xff0c;就是在 MyBatis 中…...

实时消息推送系统,写得太好了!

websocket 协议是在 http 协议上的一种补充协议&#xff0c;是 html5 的新特性&#xff0c;是一种持久化的协议。其实 websocket 和 http 关系并不是很大&#xff0c;不过都是属于应用层的协议&#xff0c;接下来我们就开始实战。 websocket 定时推送 本教程基于 springboot …...

泛微E9开发 控制日期浏览按钮的可选日期范围

控制日期浏览按钮的可选日期范围 1、需求说明2、实现方法3、扩展知识点控制日期浏览按钮的可选日期范围格式参数说明演示 1、需求说明 控制日期浏览按钮的可选日期范围为2024/07/01~2024/07/31&#xff0c;如下图所示 2. 控制日期浏览按钮的可选日期范围在当前时间的前一周~当…...

ppt接单渠道大公开‼️

PPT 接单主要分两种&#xff1a;PPT 模板投稿和PPT 定制接单&#xff0c;我们先从简单的 PPT 模板投稿说起。 PPT 模板投稿 利用业余时间&#xff0c;做一些 PPT 模板上传到平台&#xff0c;只要有人下载你的模板&#xff0c;你就有收入。如果模板质量高&#xff0c;简直就是一…...

从零开始搭建vite开发环境

准备 nodejs 18 pnpm https://vitejs.cn/ 开始 pnpm init pnpm add -D vite新建index.html <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width…...