【负载均衡oj】(四) 运行模块

一.目的

主要负责运行可执行程序。通过文件名就能运行程序。

二.runner

run运行模块: 不需要关心运行结果是否正确,只具备基本运行功能并只关心是否运行出错。

一个程序的时候,有三种IO需要关心,标准错误,标准输出,标准输入,可能不会使用到但离不开这些功能。创建出这三个文件和文件描述符,并继承给子进程。同样让子进程执行运行逻辑,父进程等待判断运行是否成功。通过信号提取运行状态

status的低16位的高8位保存子进程的返回值,高8位表示的是退出码的数字(这里不关心)

status的低16位的低8位中保存子进程异常退出的信号值,其实也只用到了其中的低7位,没用的那个是核心转储标记位

static int Run(const std::string &file_name, int cpu_limit, int mem_limit){// 标准输入: 不处理// 标准输出: 程序运行完成,输出结果是什么// 标准错误: 运行时错误信息// 运行时可能会需要输入输出,同时有可能出现错误// 所以需要这些位置的路径std::string _execute = PathUtil::Exe(file_name);   // 执行程序路径std::string _stdin = PathUtil::Stdin(file_name);   // 新的输入路径std::string _stdout = PathUtil::Stdout(file_name); // 新的输出路径std::string _stderr = PathUtil::Stderr(file_name); // 新的错误路径// 打开文件描述符(主进程打开文件描述符需要关闭)umask(0);// 输入只提供创建和读的权限int _stdin_fd = open(_stdin.c_str(), O_CREAT | O_RDONLY, 0644);// 输出只提供创建和写的权限int _stdout_fd = open(_stdout.c_str(), O_CREAT | O_WRONLY, 0644);// 错误只提供创建和写的权限int _stderr_fd = open(_stderr.c_str(), O_CREAT | O_WRONLY, 0644);if (_stdin_fd < 0 || _stdout_fd < 0 || _stderr_fd < 0){LOG(ERROR) << "程序运行时打开文件描述符失败"<< "\n";return -1; // 代表打开文件失败}// 创建子进程程序替换pid_t pid = fork();if (pid < 0){LOG(ERROR) << "程序运行时创建子进程失败"<< "\n";close(_stdin_fd);close(_stdout_fd);close(_stderr_fd);return -2; // 代表创建子进程失败}else if (pid == 0) // 子进程执行程序替换执行用户的程序{// 文件描述符重定向后程序替换dup2(_stdin_fd, 0);dup2(_stdout_fd, 1);dup2(_stderr_fd, 2);SetProcLimit(cpu_limit, mem_limit);execl(_execute.c_str() /*我要执行谁*/, _execute.c_str() /*我想在命令行上如何执行该程序*/, nullptr);exit(1);}else // 主进程回收{close(_stdin_fd);close(_stdout_fd);close(_stderr_fd);// status的低16位的低8位中保存子进程异常退出的信号值int status = 0; // 将子进程的退出码保存在status内并判断状态,通过信号waitpid(pid, &status, 0);// 程序运行异常,可以通过信号判断LOG(INFO) << "运行完毕, info: " << (status & 0x7F) << "\n";return status & 0x7F;}}

添加资源限制:

可以通过下图所示函数对用户的程序进行限制。这样当到达限制条件的时候此进程就会被操作系统通过信号杀掉,经过测验,cpu触发终止发送的是24号信号,内存终止条件发送的是6号信号。

// 限制用户程序的运行时间和可使用内存大小static void SetProcLimit(int _cpu_limit, int _mem_limit) // 内存大小以kb为单位{// 设置cpu调度时间上限struct rlimit cpu_limit;cpu_limit.rlim_cur = _cpu_limit;    // 人为设置的上限cpu_limit.rlim_max = RLIM_INFINITY; // 硬件上限// 将参数设置进限制函数内setrlimit(RLIMIT_CPU, &cpu_limit);// 设置内存上限struct rlimit mem_limit;mem_limit.rlim_cur = _mem_limit * 1024; // 人为设置的上限mem_limit.rlim_max = RLIM_INFINITY;     // 硬件上限// 将参数设置进限制函数内setrlimit(RLIMIT_AS, &mem_limit);}

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

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

相关文章

Kubernetes调试终极武器: K8sGPT

K8sGPT结合了GPT的AI能力&#xff0c;为智能化分析和运维Kubernetes集群提供了开箱即用的解决方案。原文: K8s Tools — K8sGPT[1] 随着人工智能和机器学习技术的进步&#xff0c;企业和组织越来越多的探索创新战略&#xff0c;以求利用这些能力来获得竞争优势。 K8sGPT[2]就是…

vue3+luckyexcel+php在线编辑excel文件

开发过程中&#xff0c;需要开发一个在线编辑excel文档的功能&#xff0c;找到了这个合适的组件 Luckysheet &#xff0c;一款纯前端类似excel的在线表格&#xff0c;功能强大、配置简单、完全开源。 可以导入文档&#xff0c;预览、编辑、保存、导出等功能&#xff0c;可以满…

去水印软件哪个好用?用他们就够了

随着数字媒体的发展&#xff0c;越来越多的人开始需要处理带有水印的图片或视频。水印不仅是一种版权保护手段&#xff0c;也常常被用来标记图片或视频的来源。然而&#xff0c;在某些情况下&#xff0c;我们可能需要去除水印以实现更好的使用效果。那么&#xff0c;去水印软件…

使用克魔助手查看IOS游戏FPS的方法详解

查看IOS游戏FPS 摘要 本篇技术博客将介绍如何使用克魔助手工具来查看iOS游戏的帧率&#xff08;FPS&#xff09;。通过克魔助手&#xff0c;开发者可以轻松监测游戏性能&#xff0c;以提升用户体验和游戏质量。 引言 在iOS游戏开发过程中&#xff0c;了解游戏的帧率对于优化…

16-网络安全框架及模型-BiBa完整性模型

目录 BiBa完整性模型 1 背景概述 2 模型原理 3 主要特性 4 优势和局限性 5 应用场景 BiBa完整性模型 1 背景概述 Biba完整性模型是用于保护数据完整性的模型&#xff0c;它的主要目标是确保数据的准确性和一致性&#xff0c;防止未授权的修改和破坏。在这个模型中&#…

SpreadJS 集成使用案例

SpreadJS 集成案例 介绍&#xff1a; SpreadJS 基于 HTML5 标准&#xff0c;支持跨平台开发和集成&#xff0c;支持所有主流浏览器&#xff0c;无需预装任何插件或第三方组件&#xff0c;以原生的方式嵌入各类应用&#xff0c;可以与各类后端技术框架相结合。SpreadJS 以 纯前…

打开相机失败 出现错误的原因

如何解决&#xff1f; Debug中缺少DLL文件 以下参考周姐文档 相机调用步骤 学习相机第三方库的安装 https://blog.csdn.net/Qingshan_z/article/details/117257136书签&#xff1a;QT添加库&#xff08;静态库和动态库&#xff09;_Qingshan_z的博客-CSDN博客_qt添加库 添加文…

ASUS华硕ROG幻16 2023款GU603VU VV VI笔记本电脑原厂Win11.22H2系统

链接&#xff1a;https://pan.baidu.com/s/1AgevUZleCHBJgCBcIp5CFQ?pwdhjxy 提取码&#xff1a;hjxy 华硕笔记本2023款幻16原厂Windows11系统自带所有驱动、出厂主题壁纸、Office办公软件、MyASUS华硕电脑管家、Armoury Crate奥创控制中心等预装程序 文件格式&#xff1…

WEB渗透—PHP反序列化(九)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

网络隔离后,怎样建立高效安全的数据安全交换通道?

数据安全对企业生存发展有着举足轻重的影响&#xff0c;数据资产的外泄、破坏都会导致企业无可挽回的经济损失和核心竞争力缺失。数据流动才能让其释放价值&#xff0c;想要保护企业核心资产&#xff0c;就要实现数据安全交换。 很多企业为了防止知识产权、商业机密数据泄露&am…

树莓派安装Nginx搭建web服务器结合内网穿透实现无公网IP远程访问本地站点

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

errors包返回堆栈信息的性能测试

errors包返回堆栈信息的性能测试 上一篇Golang中使用errors返回调用堆栈信息 讲了使用第三方开源库的errors github.com/go-errors/errors&#xff0c;错误信息带调用栈&#xff0c;方便定位错误的抛出位置。 通过堆栈的信息来定位是方便了&#xff0c;性能怎么样&#xff0c…

Pandas教程(三)—— 数据清洗与准备

1.处理缺失值 1.1 数据删除函数 作用&#xff1a;删除Dataframe某行或某列的数据 语法&#xff1a;df.drop&#xff08; labels [ ] &#xff09; drop函数的几个参数&#xff1a; labels &#xff1a;接收一个列表&#xff0c;内含删除行 / 列的索引编号或索引名 axis &…

抖音、小红书、视频号是如何判定是否限流的?

在这个新媒体营销的时代&#xff0c;抖音、小红书和视频号作为中国最受欢迎的社交媒体平台&#xff0c;为品牌和内容创作者提供了极具潜力的展示空间。然而&#xff0c;无论在哪个平台&#xff0c;限流成为很多人的苦恼。 抖音的推荐算法基于人群画像和初始流量池&#xff0c;同…

k8s的二进制部署(源码包部署)

实验条件&#xff1a; 主机名 IP地址 组件 作用 master01 20.0.0.17 kube-apiserver、kube-controller-manager、kube-scheduler、etcd k8s部署 master02 20.0.0.27 kube-apiserver、kube-controller-manager、kube-scheduler node01 20.0.0.37 kubelet、kube-pro…

Java开发框架和中间件面试题(10)

目录 104.怎么保证缓存和数据库数据的一致性&#xff1f; 105.什么是缓存穿透&#xff0c;什么是缓存雪崩&#xff1f;怎么解决&#xff1f; 106.如何对数据库进行优化&#xff1f; 107.使用索引时有哪些原则&#xff1f; 108.存储过程如何进行优化&#xff1f; 109.说说…

JVM高频面试题(2023最新版)

JVM面试题 1、JVM内存区域 Jvm包含两个子系统和两个组件。 1.1子系统 Class loader&#xff08;类加载器&#xff09;&#xff1a;根据给定的全限定名类名&#xff08;java.lang.object&#xff09;来装载class文件到Runtime data area&#xff08;运行时数据区&#xff09;…

医院安全(不良)事件报告系统源码 支持二次开发、支持源码交付

医疗不良事件报告系统源码旨在建立全面的、统一的医疗不良事件标准分类系统和患者安全术语&#xff0c;使不良事件上报管理更加标准化和科学化。通过借鉴国内外医疗不良事件报告系统的先进经验&#xff0c;根据医疗不良事件的事件类型、处理事件的不同部门&#xff0c;灵活设置…

【python 的各种模块】(8) 在python使用matplotlib和wordcloud库来画wordcloud词云图

目录 目标&#xff1a;用python画出&#xff0c;网上流行的wordcloud词云图 1 准备工作 1.1环境准备 1.1.1安装步骤 1.2 资源准备 1.2.1 文本文件内容如下 1.2.2 图片资源 2 代码测试 2.1 第一版代码和效果 2.1.1 代码和效果 2.1.2 一般plt里解决中文乱码问题 2.1…

Java中XML的解析

1.采用第三方开元工具dom4j完成 使用步骤 1.导包dom4j的jar包 2.add as lib.... 3.创建核心对象, 读取xml得到Document对象 SAXReader sr new SAXReader(); Document doc sr.read(String path); 4.根据Document获取根元素对象 Element root doc.getRootElement(); …