负载均衡oj项目:编译模块

编译运行模块是一个网络服务,这样编译模块就可以可以快速部署到,其他主机上。

编译模块思路

util.hpp

#pragma once
#include <string>
#include <vector>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/time.h>
#include <atomic>
#include <fstream>
#include <boost/algorithm/string.hpp>
namespace ns_util
{
    class utiltime
    {
    public:
        static std::string getTime() // 获取秒级别的时间戳
        {
            timeval t;
            gettimeofday(&t, nullptr);
            return std::to_string(t.tv_sec);
        }

        static std::string getMTime() // 获取微秒级别的时间戳
        {
            timeval t;
            gettimeofday(&t, nullptr);
            return std::to_string(t.tv_sec * 1000 + t.tv_usec / 1000);
        }
    };

    std::string path = "../temp/";
    class util
    {

    private:
        static std::string addSuffix(std::string &filename, std::string suffix)
        {
            std::string ret = path;
            ret += filename;
            ret += suffix;
            return ret;
        }

    public:
        // 构建完整的编译文件的路径 + 后缀
        //  1234 -> 1234.cpp
        static std::string src(std::string filename)
        {
            return addSuffix(filename, ".cpp");
        }

        // 构建编译生成 可执行程序名字 + 后缀
        //  1234 -> 1234.exe
        static std::string exu(std::string filename)
        {
            return addSuffix(filename, ".exe");
        }

        // 构建编译错误生成的 文件名 + 后缀
        static std::string err(std::string filename)
        {
            return addSuffix(filename, ".cerr");
        }

        // 构建运行时 输入的 文件名 + 后缀
        static std::string Stdin(std::string filename)
        {
            return addSuffix(filename, ".stdin");
        }

        // 构建运行时 输出的 文件名 + 后缀
        static std::string Stdout(std::string filename)
        {
            return addSuffix(filename, ".stdout");
        }

        // 构建输出错误的文件名 + 后缀
        static std::string Stderr(std::string filename)
        {
            return addSuffix(filename, ".stderr");
        }
    };

    // 检索文件是否存在
    class utilfile
    {
    public:
        // 清理临时文件
        static void clearTempfile(const std::string &filename)
        {
            // 因为生成文件数是不确定的,所以删除之前需要判断其存不存在
            if (fileIsExsit(util::src(filename)))
                unlink(util::src(filename).c_str());

            if (fileIsExsit(util::exu(filename)))
                unlink(util::exu(filename).c_str());

            if (fileIsExsit(util::err(filename)))
                unlink(util::err(filename).c_str());

            if (fileIsExsit(util::Stdin(filename)))
                unlink(util::Stdin(filename).c_str());

            if (fileIsExsit(util::Stdout(filename)))
                unlink(util::Stdout(filename).c_str());

            if (fileIsExsit(util::Stderr(filename)))
                unlink(util::Stderr(filename).c_str());
        }

        // 判断文件是否存在
        static bool fileIsExsit(std::string filename)
        {
            struct stat statbuf;
            int n = stat(filename.c_str(), &statbuf);
            return n == 0 ? true : false;
        }
        // 毫秒级时间戳 + 唯一原子递增值
        static std::string uniquefilename() // 生成一个唯一的文件名
        {
            static std::atomic_int a(0);
            a++;
            std::string t = utiltime::getMTime();

            return t + "_" + std::to_string(a);
        }

        static bool writefile(const std::string &filename, std::string &buffer) //  向代码文件中写入
        {
            std::ofstream out(filename);
            if (!out.is_open())
            {
                return false;
            }
            out << buffer;
            out.close();
            return true;
        }

        //读取文件
        static bool readfile(const std::string &filename, std::string &buffer, bool keep = false /*是否保存\n */)
        {
            buffer.clear();
            std::ifstream in(filename);
            if (!in.is_open())
            {
                return false;
            }

            std::string tmp;
            while (getline(in, tmp))
            {
                buffer += tmp;
                buffer += (keep ? "\n" : "");
            }

            in.close();
            return true;
        }
    };

    class utilstring
    {
        public:
        // s s输入型参数,打算切割的字符串s
        // ret 输出型参数, 存储切割完之后的部分
        // sep 以哪种分割符进行切割
        static void substring(std::string s, std::vector<std::string> &ret,const std::string &sep)
        {
            boost::split(ret , s, boost::is_any_of(sep), boost::algorithm::token_compress_on);
        }
    };

}

complier.hpp

#pragma once
#include <iostream>
#include <unistd.h>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <wait.h>
#include <fcntl.h>
#include "../comm/util.hpp" // 工具类
#include "../comm/log.hpp"

namespace ns_complier
{
    using namespace ns_log;
    using namespace ns_util;
    class complier
    {
    public:
        complier() {}
        ~complier() {}
        
    
        static bool complie(std::string filename)
        {
            pid_t pid = fork();
            if (pid < 0) //创建进程失败
            {
                Log(ERROR) << "crate child process fail" << std::endl;
                return false;
            }
            else if (pid == 0)// 子进程 进行编译工作
            {
                // 进行程序替换
                umask(0); //权限掩码设置为0
                Log(INFO) << "crate child process sucess" << std::endl;
                int _stdrr = open(ns_util::util::err(filename).c_str(),\
                O_CREAT| O_WRONLY , 0644);
                if(_stdrr < 0)
                {
                    Log(ERROR) << "open file fail" << std::endl;
                    exit(1);
                }
                // 将标准错误重定向到编译错误文件当中
                int n = dup2(_stdrr, STDERR_FILENO);
                if(n < 0)
                    Log(ERROR) << "dup2 fail" << std::endl;
               // util::exu() util::src() 详情见工具类
                Log(DEBUG) << util::exu(filename) << " " << util::src(filename).c_str();
               //程序替换为g++进行编译
                execlp("g++", "g++", "-o", util::exu(filename).c_str(),\
                 util::src(filename).c_str(),"-D", "ONLINE", nullptr /*必须以nullptr结尾 */);// -D选项是条件编译的选项,是为了避免拼 用户代码和测试用例的时候报错。
                exit(2);    
            }
            else
            {
                waitpid(pid, nullptr, 0);
                //std::cout << filename << std::endl;
                if (ns_util::utilfile::fileIsExsit(util::exu(filename))) // 文件存在编译成功
                {
                    Log(INFO) << "complie success" << std::endl;
                    return true;
                }
            }
            Log(INFO) << "complie fail" << std::endl;
            return false;
        }

    private:
    };
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

绿色浪潮,VELO Angel Glide坐垫奏响环保骑行乐章

地球的环境日益恶劣&#xff0c;冰川消融、海平面上升、极端天气频繁出现&#xff0c;这一切都在不断提醒着我们&#xff0c;保护地球家园刻不容缓。而在这场关乎人类未来的环保行动中&#xff0c;各个领域都在积极探索可持续发展的道路&#xff0c;自行车坐垫领域也迎来了绿色…

【从零开始入门unity游戏开发之——C#篇09】if-else条件表达式、三元运算符、switch-case的使用

文章目录 一、if条件表达式1、if 语句基本结构示例输出&#xff1a; 2、else语句示例输出&#xff1a; 3、else if 语句示例输出&#xff1a; 4、组合逻辑运算符示例输出&#xff1a; 5、嵌套 if 语句示例输出&#xff1a;总结 二、三元运算符1、语法&#xff1a;2、示例&#…

Visual Studio 使用 GitHub Copilot 扩展

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

conda学习

参考: Anaconda 官网教程 https://freelearning.anaconda.cloud/get-started-with-anaconda/18202conda配置虚拟环境/conda环境迁移/python环境迁移 https://blog.csdn.net/qq_43369406/article/details/127140839 环境&#xff1a; macOS 15.2Anaconda Navigator 2.4.2 x.1…

Nginx配置示例教程

最近对Nginx做了一些初步研究&#xff0c;Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发。主要根据工作中各类应用服务部署访问的需求&#xff0c;围绕HTTP服务、负载均衡、正反向代理、子路由、静态资源发布访问等&#xff0c;以及结合minio管理的图片文件资…

git使用教程(超详细)-透彻理解git

一.核心基础 核心概念有六个 首先请把与svn有关的一切概念暂时从你的脑海中移除掉&#xff0c;我们要重新认识本文所讲述的所有概念。 1.worktree worktree是一个目录&#xff0c;你在这里对文件进行增加、删除、修改。也就是我们常说的工作区。在git中worktree必须要与一个…

Django结合websocket实现分组的多人聊天

其他地方和上一篇大致相同&#xff0c;上一篇地址点击进入, 改动点1&#xff1a;在setting.py中最后再添加如下配置&#xff1a; # 多人聊天 CHANNEL_LAYERS {"default":{"BACKEND": "channels.layers.InMemoryChannelLayer"} }因此完整的se…

Keil-MDK开发环境编译后axf自动转换bin格式文件

编译选项添加如下&#xff0c;调用fromelf工具自动完成转换&#xff1a; fromelf --bin -o "$LL.bin" "#L"

如何快速搭建若依管理系统?

1、下载若依管理系统前后端分离版代码至本地&#xff08;当前版本为RuoYi v3.8.8&#xff09;&#xff1a; RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分离权限管理系统&#xff0c;同时提供…

【JavaEE】网络(1)

&#x1f435;本篇文章开始讲解计算机网络相关的知识 一、基础概念 1.1 局域网和广域网 局域网→Local Area Network→简称LAN&#xff0c;局域网是局部组建的一种私有网络&#xff0c;局域网内的主机之间可以进行网络通信&#xff0c;局域网和局域网之间在没有连接的情况不能…

网络应用技术 实验八:防火墙实现访问控制(华为ensp)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验步骤 1、设计全网 IP 地址 2、设计防火墙安全策略 3、在 eNSP 中部署园区网 4、配置用户主机地址 5、配置网络设备 配置交换机SW-1~SW-5 配置路由交换机RS-1~RS-5 配置路由器R-1~R-3 6、配置仿…

day11 性能测试(4)——Jmeter使用(黑马的完结,课程不全)直连数据库+逻辑控制器+定时器

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、复习 1.1 断言&#xff08;3种&#xff09; 1.2 关联&#xff08;3种&#xff09; 1.3 录制脚本 2、Jmeter直连数据库 2.1 直连数据库——使用场景 2.2 直连数据库——操作步骤 2.2.1 案例1&…

Modelscope AgentFabric: 开放可定制的AI智能体构建框架

目录 git clone https://github.com/modelscope/modelscope-agent.git cd modelscope-agent && pip install -r requirements.txt && pip install -r apps/agentfabric/requirements.txtexport PYTHONPATH$PYTHONPATH:/home/ubuntu/users/lilingfei/modelscop…

CSS|08 浮动清除浮动

浮动 需求: 能够实现让多个元素排在同一行&#xff0c;并且给这些元素设置宽度与高度! 让多个元素排在同一行:行内元素的特性 给这些元素设置宽高:块级元素的特性 在标准文档流中的元素只有两种:块级元素和行内元素。如果想让一些元素既要有块级元素的特点也要有行内元素的特…

[Pro Git#3] 远程仓库 | ssh key | .gitignore配置

目录 1. 分布式版本控制系统的概念 2. 实际使用中的“中央服务器” 3. 远程仓库的理解 4. 新建远程仓库 5. 克隆远程仓库 6. 设置SSH Key 实验 一、多用户协作与公钥管理 二、克隆后的本地与远程分支对应 三、向远程仓库推送 四、拉取远程仓库更新 五、配置Git忽略…

【uni-app】App与webview双向实时通信

【uni-app】App与webview双向实时通信 在 Uniapp 中&#xff0c;App 与 里面嵌入的 webview 进行双向的实时通信 vue2 &#xff0c; 模拟器 主要分为两部分 webview 向 app 发送信息 app 向 webview 发送信息 以下是实现方式&#xff0c;用一个例子来说明 &#xff08;文…

微信小程序处理交易投诉管理,支持多小程序

大家好&#xff0c;我是小悟 1、问题背景 玩过微信小程序生态的&#xff0c;或许就有这种感受&#xff0c;如果收到投诉单&#xff0c;不会及时通知到手机端&#xff0c;而是每天早上10:00向小程序的管理员及运营者推送通知。通知内容为截至前一天24时该小程序账号内待处理的交…

AIGC-------AI生成内容如何赋能AR和VR体验?

AI生成内容如何赋能AR和VR体验 引言 增强现实&#xff08;AR&#xff09;和虚拟现实&#xff08;VR&#xff09;技术近年来蓬勃发展&#xff0c;为用户提供了沉浸式的体验。这些技术已经广泛应用于游戏、教育、医疗、建筑等领域。然而&#xff0c;AR和VR体验的质量与内容的丰富…

zotero安装教程(包括茉莉花插件)

zotero安装教程&#xff08;包括茉莉花插件&#xff09; zotero下载(windows)1-安装 Zotero2-安装 Zotero Connector3-安装浏览器插件--jasminum茉莉花功能&#xff1a;插件下载地址&#xff1a;[https://github.com/search?qjasminum&typerepositories](https://github.c…

M|可可西里

title: 可可西里 time: 2024-12-15 周日 rating: 8.5 豆瓣: 8.9 上映时间: “2004” 类型: M剧情犯罪 导演: 陆川 Chuan Lu 主演: 多布杰 Duobujie张垒 Lei Zhang 国家/地区: 中国大陆 片长/分钟: 90分钟 M&#xff5c;可可西里 粗砺的苍凉&#xff0c;沉默的悲壮。…