【负载均衡式在线OJ项目day3】运行模块

一.前言

上一篇文章实现了编译模块,今天来实现Runner运行模块

二.设计思路

运行模块只负责运行可执行程序,所以前提是已经有了可执行程序。

首先创建子进程,然后子进程程序替换成可执行程序,然后把退出信息交给父进程。父进程只关心可执行程序是否是正常退出,而不关心运行结果是否正确,所以父进程只关注退出信息中的退出信号。

子进程程序替换之前,应当将标准输入,标准输出,标准错误重定向到临时文件,因为将来的输入的测试用例一定是从文件中来,输出结果也放到文件中方便对比正确性,运行中的错误信息也放到文件,将来返回给用户。

这里涉及到一个细节,临时文件是放在父进程还是子进程打开?在设计编译模块时,临时文件打开和重定向都是在子进程,但这里却没这么简单。编译模块之所以在子进程打开,是因为父进程能通过是否形成了可执行程序,来判断编译是否成功,但此处就没有这种巧妙的判断方法。

如果子进程在打开临时文件或者程序替换时出错,父进程如何得知呢?通过子进程的退出码吗?不可行,因为父进程无法知道这个退出码是用户的程序返回的,还是程序替换前我们的代码返回的。所以不得不使用进程间通信的方式,例如匿名管道。所以这里索性麻烦一些,在父进程就打开临时文件,让子进程继承下去,方便做差错处理。不过要记得关闭文件描述符

 运行时还应该有时间和空间资源限制,可以使用setrlimt系统调用,来限制进程占用CPU的时间,和申请虚拟内存的大小。如果超时进程会受到SIGXCPU,超空间会收到SIGABRT信号,使进程退出。

三.接口设计 

参数:

1.fileName:要运行的可执行程序名(不包括后缀和路径)

2.cpuLimit:程序运行可以使用最大CPU资源上限,单位s

3.memLimit:程序运行可以使用最大内存资源上限,单位KB

       

返回值val:

1.val = 0:代码跑完,正常退出

2.val > 0:代码没跑完,收到信号退出了,val就是信号编号

3.val < 0:内部出错了。打开临时文件失败返回-1。创建子进程失败返回-2,


这里的返回值并没有像编译模块一样,直接返回true或者false,因为后续如果进程异常退出,我们想给用户返回信号编号。

四.代码实现 

#pragma once
#include <iostream>
#include <string>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <cstdlib>
#include <sys/time.h>
#include <sys/resource.h>
#include "../Common/Util.hpp"
#include "../Common/Log.hpp"
namespace ns_runner
{using namespace ns_util;using namespace ns_log;class Runner{public:/******************** 返回值val:* 1.val = 0:代码跑完,正常退出* 2.val > 0:代码没跑完,收到信号退出了,val就是信号编号* 3.val < 0:内部出错了。创建子进程失败返回-2,打开临时文件失败返回-1** 参数:* 1.fileName:要运行的可执行程序名(不包括后缀和路径)* 2.cpuLimit:程序运行可以使用最大CPU资源上限,单位s* 3.memLimit:程序运行可以使用最大内存资源上限,单位KB* ****************/static int run(const std::string &fileName, int cpuLimit, int memLimit){// 打开标准输入,标准输出,标准错误重定向的临时文件// 本来在子进程中做更合适,但是如果出错了不便于把错误码交给父进程umask(0);int _stdin = open(PathUtil::stdin(fileName).c_str(), O_CREAT | O_RDONLY, 0664);int _stdout = open(PathUtil::stdout(fileName).c_str(), O_CREAT | O_WRONLY, 0664);int _stderr = open(PathUtil::stderr(fileName).c_str(), O_CREAT | O_WRONLY, 0664);if (_stdin < 0 || _stdout < 0 || _stderr < 0){close(_stdin);close(_stdout);close(_stderr);LOG(ERROR) << "运行时打开临时文件失败" << std::endl;return -1;}pid_t pid = fork();if (pid < 0){LOG(ERROR) << "运行时创建子进程失败" << std::endl;close(_stdin);close(_stdout);close(_stderr);return -2; // 创建子进程失败}else if (pid == 0){dup2(_stdin, 0);dup2(_stdout, 1);dup2(_stderr, 2);setProcLimit(cpuLimit, memLimit);std::string excute = PathUtil::exe(fileName);execl(excute.c_str(), excute.c_str(), nullptr);exit(1);}else{int status = 0;waitpid(pid, &status, 0);LOG(INFO) << "运行完毕, info: " << (status & 0x7f) << std::endl;close(_stdin);close(_stdout);close(_stderr);return status & 0x7f;}}/************ 功能:设置进程占用资源限制* * 参数:* 1.cpuLimit:程序运行可以使用最大CPU资源上限,单位s* 2.memLimit:程序运行可以使用最大虚拟内存资源上限,单位KB* ***********/static void setProcLimit(int cpuLimit, int memLimit){struct rlimit cpuRlimit;cpuRlimit.rlim_max = RLIM_INFINITY;cpuRlimit.rlim_cur = cpuLimit;setrlimit(RLIMIT_CPU, &cpuRlimit);struct rlimit memRlimit;memRlimit.rlim_max = RLIM_INFINITY;memRlimit.rlim_cur = memLimit * 1024;setrlimit(RLIMIT_AS, &memRlimit);}};
}

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

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

相关文章

读天才与算法:人脑与AI的数学思维笔记22_中文房间

1. 华生的工作模式 1.1. 请你想象一个巨大的场景&#xff0c;其中有单词、名字和其他可能的答案&#xff0c;它们散布在各处 1.1.1. IBM所做的第一步是以某种连贯的方式排列单词 1.1.2. 第二步是理解每个问题&#xff0c;并为该问题生成候选位置标记 1.1.2.1. 爱因斯坦会演…

IT项目管理-大题【太原理工大学】

一、根据进度网络写出时间参数表、关键路径、总工期 此类题一般是给一个表&#xff0c;问三问。 第一问会问某个活动的时间参数&#xff0c;但我们需要把整个表都求出来&#xff0c;否则单求一个很困难&#xff08;如果你就是不想求整张表也行&#xff0c;不是硬性要求&#xf…

vue3 - 150

目录 vue优势使用方式编写vue代码指令响应式数据其他 vue优势 功能全面生态好&#xff0c;语法简洁效率高&#xff0c;免去 DOM 操作苦&#xff0c;开发重任一肩挑&#xff01; 使用方式 1.通过cdn引入来将 Vue 应用到整个页面 2.或通过官方脚手架 create-vue来创建完整的v…

js之dom学习

在网页开发中&#xff0c;DOM&#xff08;文档对象模型&#xff09;扮演着重要的角色。它是 JavaScript 与网页内容交互的基础&#xff0c;同时也是实现网页动态性和交互性的关键。本文将介绍 DOM 的基本概念、操作方法以及一些实用技巧&#xff0c;帮助读者更好地理解和运用 D…

直播报名 | 珈和科技携手潍柴雷沃共探“现代农场”未来式

数据赋农季系列直播第四期&#xff0c;我们将以“未来农业发展趋势之农场智慧化、管理数据化”为主题展开&#xff0c;此次系列直播由珈和科技及湖北珞珈实验室共同主办&#xff0c;第四期直播很荣幸邀请到潍柴雷沃参与其中&#xff0c;双方将就智慧农服平台和数据交易SaaS平台…

基于PHP高考志愿填报系统搭建私有化部署源码

金秋志愿高考志愿填报系统是一款为高中毕业生提供志愿填报服务的在线平台。该系统旨在帮助学生更加科学、合理地选择自己的大学专业和学校&#xff0c;从而为未来的职业发展打下坚实的基础。 该系统的主要功能包括:报考信息查询、志愿填报数据指导、专业信息查询、院校信息查询…

Python-VBA函数之旅-round函数

目录 一、round函数的常见应用场景 二、round函数使用注意事项 三、如何用好round函数&#xff1f; 1、round函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://blog.csdn.net/ygb_1024?spm1010.2…

04、Kafka集群安装

1、准备工作 首先准备一台虚拟机&#xff0c;centos7系统&#xff0c;先在一台上配置安装后&#xff0c;最后克隆成多台机器。 1.1 安装JDK &#xff08;1&#xff09;下载JDK&#xff0c;上传到 /root/software 路径 下载地址&#xff1a;https://www.oracle.com/cn/java/…

Kotlin版本的Gradle全局配置init.gradle.kts及参考文档

工欲善其事&#xff0c; 必先利其器。 文章目录 init.gradle.ktsGroovy版本的init.gradle其他有用的settings.gradle.ktskotlin 与 compose 版本对应关系agp 与 gradle 版本对应关系gradle下载器 直接在.gradle文件夹下添加文件init.gradle / init.gradle.kt for kotlin dsl. …

【PyTorch实战演练】使用CelebA数据集训练DCGAN(深度卷积生成对抗网络)并生成人脸(附完整代码)

文章目录 0. 前言1. CelebA数据集1.1 核心特性与规模1.2 应用与用途1.3 获取方式1.4 数据预处理 2. DCGAN的模型构建2.1 生成器模型2.2 判别器模型 3. DCGAN的模型训练&#xff08;重点&#xff09;3.1 训练参数3.2 模型参数初始化3.3 训练过程 4. 结果展示4.1 loss值变化过程4…

【算法】用存入下标的方法来巧解单调队列

前言&#xff1a; 本系列是看的B站董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com) C单调队列 P1886 滑动窗口 /【模板】单调队列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) k为窗口的大小 维护最小值就是维护窗口内…

Linux —— 进程间通信

目录 一、进程间通信的介绍二、管道三、匿名管道四、命名管道五、system V进程间通信 一、进程间通信的介绍 1.进程间通信的概念 进程通信&#xff08;Interprocess communication&#xff09;&#xff0c;简称&#xff1a;IPC&#xff1b; 本来进程之间是相互独立的。但是…

供应SKY85405-31思佳讯芯片

长期供应各品牌芯片&#xff1a; ATSAMG55J19B-AU MT5931A/B HS8298H DS90UB927QSQX/NOPB NVP2443I SMD3225 MAX9295A IP00C787 TMS320F28235PGFA ACPM-5501-TR1 AFEM-7738-AG1 AFEM-792503-AP1 ACPF-7041-TR1 ACPM-7833-TR1 AFEM-7613-TR1 HSMD-C150 QSMA-C2…

Elasticsearch的基本使用

Elasticsearch的基本使用 1.基本概念1.1 文档和字段1.2 索引和映射1.3 mysql与elasticsearch对比 2.索引库2.1 es中mapping映射属性2.2.es中索引库的增删改查 3.文档3.1 新增文档3.2 查询文档3.3 删除文档3.4 修改文档3.4.1 全量修改3.4.2 增量修改3.5 总结 4.DSL查询语法4.1 D…

【LLM第三篇】名词解释:RLHF——chatgpt的功臣

RLHF (Reinforcement Learning from Human Feedback) &#xff0c;直译为&#xff1a;“来自人类反馈的强化学习”。RLHF是一种结合了强化学习和人类反馈的机器学习方法&#xff0c;主要用于训练大模型以执行复杂的任务&#xff0c;尤其是当这些任务难以通过传统的奖励函数来精…

CCF-Csp算法能力认证, 202303-1重复局面(C++)含解析

前言 推荐书目&#xff0c;在这里推荐那一本《算法笔记》&#xff08;胡明&#xff09;&#xff0c;需要PDF的话&#xff0c;链接如下 「链接&#xff1a;https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码&#xff1a;6vdq”复制这段内容后打开手机迅雷…

大语言模型LLM入门篇

大模型席卷全球&#xff0c;彷佛得模型者得天下。对于IT行业来说&#xff0c;以后可能没有各种软件了&#xff0c;只有各种各样的智体&#xff08;Agent&#xff09;调用各种各样的API。在这种大势下&#xff0c;笔者也阅读了很多大模型相关的资料&#xff0c;和很多新手一样&a…

深圳CPDA|如何利用数据分析改进业务流程,提高效率?

在当今数字化时代&#xff0c;数据已经成为企业决策和优化的关键资源。通过有效地收集、分析和应用数据&#xff0c;企业可以深入了解其业务流程中的瓶颈和问题&#xff0c;从而改进流程&#xff0c;提高效率。本文将探讨如何利用数据分析改进业务流程&#xff0c;并提高效率。…

Vue3+vite优化基础架构(3)--- 优化vue-i18n国际化配置

Vue3vite优化基础架构&#xff08;3&#xff09;--- 优化vue-i18n国际化配置 说明全部页面进行中英文使用测试中英文切换对ElementPlus里面的所有组件进行中英文切换 说明 这里记录下自己在Vue3vite的项目增加全局中英文切换按钮对页面进行中英文切换及同时对ElementPlus里面的…

练习题(2024/5/9)

1删除二叉搜索树中的节点 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分为…