搬瓦工的主机可以用来做网站吗如何自己做加盟网站

news/2025/9/29 19:14:55/文章来源:
搬瓦工的主机可以用来做网站吗,如何自己做加盟网站,西安关键词排名优化,宁国做网站的文章目录 一.进程间通信:进程间通信的本质: 二.Linux管道通信匿名管道:关于管道通信的要点:基于匿名管道构建进程池: 三.System-V共享内存共享内存和命名管道协同通信 参考Linux内核源码版本------linux-2.4.3 一.进程间通信: 操作系统中,为了保证安全性,进程之间具有严格的独… 文章目录 一.进程间通信:进程间通信的本质: 二.Linux管道通信匿名管道:关于管道通信的要点:基于匿名管道构建进程池: 三.System-V共享内存共享内存和命名管道协同通信 参考Linux内核源码版本------linux-2.4.3 一.进程间通信: 操作系统中,为了保证安全性,进程之间具有严格的独立性(独立的PCB,独立的虚拟地址空间mm_struct和页表…等各种独立的系统资源),即便是父子进程之间也通过数据的写时拷贝保证了两者之间的的数据独立性.因此要实现进程间通信和任务协作,就要让不同进程的共同读写同一份信息资源.由于违背了进程独立性的原则,要实现进程间共享资源就需要一定的技术成本.进程间的独立性: 进程间通信的本质: 不同的进程对同一块内存资源进行的一系列的读写操作. 二.Linux管道通信 将同一个管道文件的文件结构体指针分别填入两个进程的文件信息列表(通过父子进程的继承关系或者open接口实现),之后两个进程便可以对管道文件的内核级读写缓冲区(本质上是一块内存)进行读写操作实现通信.管道通信是一种单向通信手段,有固定的读端进程和写端进程. 匿名管道: 匿名管道通信是父子进程间通信的一种方式.匿名管道通信机制图解: 内核视角下管道文件结构体内部结构: 关于管道通信的要点: 管道通信可用于进程间协同,提供访问控制(同步与互斥): 管道读写端正常,如果管道中缓冲区为空,则读端进程进入阻塞状态管道读写端正常,如果管道中缓冲区被写满,则写端进程进入阻塞状态管道写端先关闭,管道读端read接口返回0,标识读取结束管道读端先关闭,操作系统会终止写端进程. 基于匿名管道构建进程池: Task.hpp模拟任务列表 #include iostream #include cstdio #include string #include vector #include sys/types.h #include sys/wait.h #include cstdlib #include ctime #include cassert #include unistd.h//重定义函数指针 typedef void (*task_t)();void task1() {std::cout 执行任务1:矩阵计算 std::endl; } void task2() {std::cout 执行任务2:pid控制算法 std::endl; } void task3() {std::cout 执行任务3:图像计算 std::endl; } void task4() {std::cout 执行任务4:人脸识别算法 std::endl; }//向数组中加载任务 void LoadTask(std::vectortask_t tasks) {tasks.push_back(task1);tasks.push_back(task2);tasks.push_back(task3);tasks.push_back(task4); }#include Task.hpp using namespace std; #define ChildNum 5//子进程信息结构体 class Channel { public: Channel(){}Channel(const string Name,pid_t Childpid,int Pipefd): _Childpid(Childpid),_Pipefd(Pipefd),_Name(Name){}pid_t getpid() const {return _Childpid;}string PrintName() const {return _Name;}int Getfd() const {return _Pipefd;} private:pid_t _Childpid;int _Pipefd; //保存管道的写入端string _Name; };//子进程任务执行函数 void slaver(const vectortask_tTaskarr) {//任务码int CommandCode 0;while(true){int check read(0,CommandCode,sizeof(CommandCode));//若管道中没有数据且写入段没有关闭,子进程就会阻塞assert(check!-1);if(check 0){std::cout slaver say get a command: getpid() : CommandCode: CommandCode std::endl;//子进程解析并执行命令if(CommandCode 0 || CommandCode Taskarr.size()){cout CommandCode Error! slaver exit! endl;exit(0);}//子进程根据任务码执行任务Taskarr[CommandCode]();}else {//一旦父进程关闭管道写入端,check就会接收到0,子进程退出break;}} }//父进程向子进程发送任务的接口 void ctrlSlaver(const std::vectorChannel channels,const vectortask_tTaskarr) {int count 10;while(count--){sleep(1);//随机选择子进程发送任务码int choseSlaver rand()%channels.size();int Task rand()%Taskarr.size();cout 父进程向子进程 channels[choseSlaver].PrintName() 写入命令: Task endl;write(channels[choseSlaver].Getfd(),Task,sizeof(Task));}sleep(1);cout \n所有任务执行完毕,系统准备退出\n endl;sleep(2); }//构建进程池接口 void InitProcessPool(vectorChannel ChildProc,const vectortask_tTaskarr) {for(int i 0; i ChildNum; i){int pipefd[2];int check pipe(pipefd);assert(!check); (void)check;pid_t pid fork();assert(pid ! -1);//父进程写 子进程读if(pid 0){//子进程执行流close(pipefd[1]);//将stdin对应文件指针修改为管道的读入端dup2(pipefd[0],0);//将文件信息列表中对应的指针位置空close(pipefd[0]);slaver(Taskarr);close(0);exit(0);}close(pipefd[0]);//将管道的写入端存入channel对象中ChildProc.push_back(Channel(string(Process ) to_string(pid),pid,pipefd[1])); } }//父进程轮询等待子进程退出 void WaitChildProc(const std::vectorChannel channels) {//先关闭各个管道的写入端,相应的子进程会自动退出for(auto e : channels){close(e.Getfd());}//等待各个子进程退出for(auto e : channels){int Status 0;waitpid(e.getpid(),Status,0);cout 写入端关闭,子进程: e.getpid() 退出,退出码: WIFEXITED(Status) endl;} }int main() {vectortask_tTaskarr;LoadTask(Taskarr);srand(time(nullptr)^getpid()^1023);vectorChannel ChildProc;InitProcessPool(ChildProc,Taskarr);ctrlSlaver(ChildProc,Taskarr);WaitChildProc(ChildProc);return 0; }命名管道和匿名管道的内核原理相同 三.System-V共享内存 共享内存通信原理: 构建共享内存通信环境的系统接口: int shmget(key_t key, size_t size, int shmflg); key是用户自定义共享内存标识键,用ftok接口获取size是申请共享内存的大小shmflg:取IPC_CREAT时,接口可以申请共享内存并获取共享内存的key,若参数指定的共享内存已存在则直接返回共享内存的key;取IPC_CREAT | IPC_EXCL时,接口只能用于申请新的共享内存. void *shmat(int shmid, const void *shmaddr, int shmflg); 接口作用:在当前进程的虚拟地址空间的共享区中为指定的共享内存块编址,并建立页表映射. int shmdt(const void *shmaddr); 接口作用:共享内存块与当前进程的虚拟地址空间取消关联,进程将无法再访问指定的共享内存 int shmctl(int shmid, int cmd, struct shmid_ds *buf); 接口作用:对共享内存块进行cmd码指定的控制操作(比如释放操作),也可以用于获取共享内存块在内核中的描述信息 共享内存通信环境中,由于多个进程可以对同一个内存块直接进行读写操作,因此,共享内存通信缺少同步互斥机制,无法保证数据的读写安全,为此,可以借助命名管道为共享内存通信提供读写控制. 共享内存和命名管道协同通信 构建通信环境的接口头文件: #ifndef __COMM_HPP__ #define __COMM_HPP__#include log.hpp #include sys/sem.h #include sys/ipc.h #include sys/shm.husing namespace std; const int SIZE 4096; const string pathname /home/user1/LinuxLearning/sharedMEM; const int pro_id 0x123456;log LOG;//获取自定义共享内存key key_t GetKey(const string pathname,const int pro_id) {//KEY生成器key_t K ftok(pathname.c_str(),pro_id);if(K 0){LOG(Fatal,GetKey Error, message: %s\n,strerror(errno));exit(-1);}LOG(Info,key generated, message: %s\n,strerror(errno));return K; }//调用系统接口申请共享内存 int GetShareMemHelper(int flag) {key_t KEY GetKey(pathname,pro_id);//系统调用接口shmget申请共享内存或返回已存在的共享内存idint shmid shmget(KEY,SIZE,flag);if(shmid -1){LOG(Fatal,Get ShareMem failed, message: %s\n,strerror(errno));exit(-1);}LOG(Info,Get ShareMem completed, message: %s\n,strerror(errno));return shmid; }//申请新的共享内存 int CreateShm() {return GetShareMemHelper(IPC_CREAT | IPC_EXCL | 0666); }//获取已存在的共享内存的id int GetShm() {return GetShareMemHelper(IPC_CREAT); }#define FIFO_FILE ./myfifo #define MODE 0664enum {FIFO_CREATE_ERR 1,FIFO_DELETE_ERR,FIFO_OPEN_ERR };class Init { public:Init(){// 创建管道int n mkfifo(FIFO_FILE, MODE);if (n -1){perror(mkfifo);exit(FIFO_CREATE_ERR);}}~Init(){//管道去链接,若引用计数为0则删除管道文件int m unlink(FIFO_FILE);if (m -1){perror(unlink);exit(FIFO_DELETE_ERR);}} };#endif自制日志类log: #pragma once #include time.h #include stdarg.h #include sys/stat.h #include fcntl.h #include iostream #include sys/types.h #include sys/wait.h #include string #include cstdio #include cstring #include cassert #include unistd.h #include stdlib.h//日志等级 #define Info 0 #define Debug 1 #define Warning 2 #define Error 3 #define Fatal 4 //日志写入方式 #define Screen 1 #define Onefile 2 #define Classfile 3 #define LogFile log.txtusing std :: string; class log { public:log(){printMethod Screen;path ./log/;}void Enable(int method){printMethod method;}string LeveltoString(int level){switch (level){case 0:return string(Info);break;case 1:return string(Debug);break;case 2:return string(Warning);break;case 3:return string(Error);break;case 4:return string(Fatal);break;default:break;}}void operator()(int level,char * format,...){//将时间格式化存入tm结构体中time_t t time(nullptr);struct tm* ctime localtime(t);char leftbuffer[1024];snprintf(leftbuffer,sizeof(leftbuffer),[%s][%d-%d-%d %d:%d:%d],LeveltoString(level).c_str(),ctime-tm_year1900,ctime-tm_mon1,ctime-tm_mday,ctime-tm_hour,ctime-tm_min,ctime-tm_sec);//解析可变参数va_list vls;va_start(vls,format);char rightbuffer[1024];vsnprintf(rightbuffer,sizeof(rightbuffer),format,vls);va_end(vls);//合并时间和可变参数char logtxt[2048];snprintf(logtxt,sizeof(logtxt),%s %s\n,leftbuffer,rightbuffer);//执行日志记录printLog(level,string(logtxt));}//日志信息写出接口void printLog(int level, const std::string logtxt){switch (printMethod){case Screen://将日志信息打印到标准输出std::cout logtxt std::endl;break;case Onefile://将日志信息存入log.txtprintOneFile(LogFile, logtxt);break;case Classfile://将日志信息存入指定的分类日志文件printClassFile(level, logtxt);break;default:break;}}//日志信息写到log.txt中void printOneFile(const std::string logname, const std::string logtxt){//path--日志保存路径 logname--日志文件名std::string _logname path logname;//打开log.txt日志文件int fd open(_logname.c_str(), O_WRONLY | O_CREAT | O_APPEND, 0666); if (fd 0)return;write(fd, logtxt.c_str(), logtxt.size());close(fd);}//日志信息写到log.txt.level中void printClassFile(int level, const std::string logtxt){//对日志文件名进行修改,根据日志等级分出多个日志文件std::string filename LogFile;filename .;// log.txt.Debug(Warning)(Fatal)filename LeveltoString(level); printOneFile(filename, logtxt);}~log(){} private:int printMethod;std::string path; };读端进程示例: #include log.hpp #include ShareMemBuild.hppextern log LOG;int main() {//创建管道和共享内存Init pipeCreate;int shmid CreateShm();//建立共享内存与进程虚拟地址空间之间的映射,并获取共享内存的虚拟地址char * shmaddr (char *)shmat(shmid,NULL,0);//打开管道文件int fd open(FIFO_FILE,O_RDONLY);if(fd -1){LOG(Fatal, error string: %s, error code: %d, strerror(errno), errno);exit(FIFO_OPEN_ERR);}while(true){//借助管道进行共享内存的读写控制,若写端没有给信号,则读端保持阻塞状态char c;int RSize read(fd,c,sizeof(c));if(RSize 0) break;//直接访问共享内存,实现高效通信cout client say shmaddr endl; sleep(1);}//进程与共享内存断开连接shmdt(shmaddr);//将共享内存标记为已销毁shmctl(shmid,IPC_RMID,nullptr);close(fd);return 0; }写端进程示例: #include log.hpp #include ShareMemBuild.hppextern log LOG;int main() { //获取共享内存标识int shmid GetShm();//建立共享内存与进程虚拟地址空间之间的映射,并获取共享内存的虚拟地址char * shmaddr (char *)shmat(shmid,NULL,0);//打开管道文件int fd open(FIFO_FILE,O_WRONLY);if(fd -1){LOG(Fatal, error string: %s, error code: %d, strerror(errno), errno);exit(FIFO_OPEN_ERR);}while(true){cout Please Enter ;//将信息写入共享内存fgets(shmaddr, 4096, stdin);//管道写入信号,解除读端的阻塞状态write(fd, c, 1); }//进程与共享内存断开连接shmdt(shmaddr);close(fd);return 0; }多个进程直接通过各自的虚拟地址空间对同一个内存块进行访问使得共享内存通信具有很高的通信效率.管道通信过程中,数据至少要经过两次拷贝(用户读写缓冲区和内核读写缓冲区之间的拷贝),而共享内存通信不存在通信数据拷贝问题共享内存,消息队列,信号量等通信内存资源(称为ipc资源)统一由操作系统描述为各种数据结构统一进行管理,在Linux内核中,描述共享内存,消息队列,信号量的结构体形成继承体系:(C语言实现的继承体系)

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

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

相关文章

[线段树系列 #6] 标记永久化

[线段树系列 #6] 标记永久化 标记永久化是线段树的一个技巧,通常用于对主席树等难以 pushdown 的数据结构进行区间修改 具体思想已经体现在名字里了,我们结合例题稍微讲解一下 例题1 P3372 【模板】线段树 1 线段树区…

c语言switch和if语句

c语言switch和if语句c语言中switch和if语句 #include <stdio.h>int main(){int category = 2;float price = 299.9;switch (category){case 1 :if (price < 500){printf("电子产品价格较低,无优惠\n&qu…

Qt(制作一个方便的文本编辑器)

Qt(制作一个方便的文本编辑器)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

购买网站空间后怎么做海南省官网

path_provider获取应用存储路径path_provider是flutter提供的一个获取应用存储路径的插件&#xff0c;它封装了统一的api来获取Android和ios两个平台的应用存储路径&#xff0c;提供的api如下&#xff1a;getTemporaryDirectory()&#xff1a;获取应用临时文件夹&#xff0c;该…

长沙建设工程造价网站wordpress连接服务器配置

戳“在看”一起来充电吧!C语言的那些经典程序 第十四期本期小C给大家带来三个用C语言解决实际问题的典例。如果全都理解&#xff0c;相信肯定能给大家带来收获&#xff01;接下来让我们看看是哪些程序吧&#xff01;1字符查找源程序&#xff1a;运行结果&#xff1a;程序分析:该…

DeepSeek-V3.2-Exp 完整分析:2025年AI模型突破与稀疏注意力技术深度解析

DeepSeek-V3.2-Exp 完整分析:2025年AI模型突破与稀疏注意力技术深度解析DeepSeek-V3.2-Exp是DeepSeek AI于2025年9月29日发布的实验性大语言模型,标志着该公司在AI架构创新方面的重要里程碑。作为V3.1-Terminus的升级…

Java EE初阶启程记05---线程安全 - 指南

Java EE初阶启程记05---线程安全 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

查域名优化方案2022

简介 上篇文章已经介绍了数据类型&#xff0c;如INTERGER TYPE、BITMASK TYPE、STRING TYPE、LINK LAYER ADDRESS TYPE、 IPV4 ADDRESS TYPE、 IPV6 ADDRESS TYPE、BOOLEAN TYPE、ICMP TYPE、CONNTRACK TYPES等。那么本篇文章主要介绍PRIMARY表达式的相关内容。 PRIMARY EXPR…

tldr的安装与利用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站内容授权书下列关于网站开发中网友上传

基于matlab的结构有限元分析。包括基于4节点四面体单元的空间块体分析、基于4节点四边形单元的矩形薄板分析、基于3节点三角形单元的矩形薄板分析、三梁平面框架结构的有限元分析、四杆桁架结构的有限元分析、基于8节点六面体单元的空间块体分析。每个程序都要相应的文档说明。…

DataGridView表格控件使用说明

可以添加和编辑列设置头部设置列的样子:设置高度 ,需要多个属性配合使用完全居中 ,每个列都需要进行设置效果展示:数据绑定 先设置属性public class SysAlarm{public string AlarmTime { get; set; }public string…

题解:P7126 [Ynoi2008] rdCcot

题意:很简单了,不再赘述。 做法: 考虑怎么数连通块,钦定一个代表元,因为这个东西是 \(C\) 邻域状物,跟深度有关,我们可以考虑一下 bfs 序,那么我们就以 bfs 序最小的元素为代表元。 然后我们就要考虑一个元素什…

阿里云网站 模板建设装修公司报价如何计算

查看源码发现 PHP非法参数名传参问题&#xff0c;详细请参考我的这篇文章&#xff1a;谈一谈PHP中关于非法参数名传参问题 正则这里绕过使用%0a换行符绕过&#xff0c;payload: /?b.u.p.t23333%0a 得到下一步信息&#xff1a;secrettw.php 注释中的是JsFuck&#xff0c;用这…

网站开发项目拖延周期免费建设视频网站

作者 | 徐运元&#xff0c;杭州谐云科技合伙人及资深架构师&#xff0c;云计算行业和 Kubernetes 生态资深从业者 导读&#xff1a;什么是 OAM&#xff1f;2019 年 10 月 17 日&#xff0c;阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟&#xff08;花名&#xff1a;小…

毕业答辩为什么做网站网站建设云技术公司推荐

1.PC按键控制 移动摄像头:WSADQE、鼠标右键 模拟双手:左手(左Shift)、右手(右Shift) 将模拟的双手保持在视野中:T或Y 旋转模拟手部:按住Ctrl并移动鼠标 捏合手势:左Shift/空格 + 鼠标左键 2.常用脚本 (1)HandInteractionTouch(需搭配NearInteractionTouchableVolum…

专业的网站开发团队xampp php网站模板

相关免费学习推荐&#xff1a;python视频教程原理十进制转n进制都可以使用倒除法&#xff1a;对十进制进行除n的运算&#xff0c;直到商为0为止&#xff0c;然后将各个步骤中得到的余数倒着写出来.n进制转十进制&#xff1a;(例子&#xff1a;二进制转十进制)101001 > 2^5 …

灰系网站深圳建站公司兴田德润放心

.gitignore简介 .gitignore文件是Git 版本控制系统中的一个重要配置文件&#xff0c;它用于指定哪些文件或目录应该被Git忽略&#xff0c;即不被纳入版本控制中。 .gitignore编写规则 在文件中添加要忽略的文件和目录的模式。每一行表示一个模式。 使用通配符来匹配多个文件或目…

网站备案 备注关联性沈阳男科最好的男科医院

1、首先配置正确Project Struct 保证需要引用的jar包库添加到Libraries里&#xff0c;尽管添加到Modules里依然可以测试运行或调试&#xff0c;但导出的jar包会遇到问题。 2、导出jar&#xff0c;方式选择如下 选择”From modules with dependencies" 然后去掉以上“Extr…

MyBatis技术详解:从入门到高效开发 - 详解

MyBatis技术详解:从入门到高效开发 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

做美食网站有哪些网络广告策略有哪些

本博客主要讲述Center的审计策略表安装和策略添加 使用事务添加 1、开启事务 my->StartTransaction(); 2、编写sql语句 //清除原来数据&#xff0c;防止数据污染my->Query("DROP TABLE IF EXISTS t_strategy");string sql "CREATE TABLE t_strategy (…