做微网站是订阅号还是服务号号泰州网站建设外包

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

做微网站是订阅号还是服务号号,泰州网站建设外包,品牌网站模板,化工网站模板下载目录 前言 运行功能开发分析 获取子进程运行信息 程序运行资源限制 运行功能开发代码 前言 上篇文章我们对客户端服务器传来的临时文件进行编译#xff0c;这篇文章主要对编译成功的代码在我们的服务器运行这块功能的开发。 运行功能开发分析 在运行功能开发之前我们默…目录 前言 运行功能开发分析 获取子进程运行信息 程序运行资源限制 运行功能开发代码 前言 上篇文章我们对客户端服务器传来的临时文件进行编译这篇文章主要对编译成功的代码在我们的服务器运行这块功能的开发。 运行功能开发分析 在运行功能开发之前我们默认已经形成了可执行程序对于该运行程序在我们的服务其中也是一个指令程序因此我们也要在该程序中创建子进程进行程序替换执行该可执行程序。 程序运行无非就是三种结果 代码跑完结果正确代码跑完结果不正确代码没跑完发生异常了 这三种情况我们不需要考虑结果的正确与否因为代码的运行结果的正确与否是有我们题目的测试用例来判断的我们只考虑能否正确运行完毕即可。 运行代码我们就要考虑下面几个问题 运行的可执行程序的文件名一个程序在启动的时候会默认打开三个流标准输入、标准输出、标准错误 对于标准输入也就是平时运行程序输入的测试用例这个我们不处理因此题目的测试用例是题目提供的我们可以重定向从文件中读取数据而不是从键盘中读取对于标准输出也就是运行完成输出的结果是什么这个需要和我们题目测试用例的答案相比较因此也需要重定向到一个临时文件中对于标准错误这是我们后端服务器运行是的错误信息不提供给用户因此也需要重定向到一个临时文件中 获取子进程运行信息 上面提到我们只考虑可执行程序运行异常的情况可执行程序的运行是通过我们的子进程进程替换我们可以通过等待子进程获取子进程的退出信息 程序运行资源限制 一些在在线OJ平台会限制运行时间和内存在Linux中我我们也可以通过系统调用来设置这个小模块 int setrlimit(int resource, const struct rlimit *rlim);返回值 如果调用成功setrlimit() 返回 0。如果调用失败返回 -1并设置 errno 变量来指示错误类型。 参数 resource指定要设置的资源类型它是一个整数常量代表了不同的资源比如 CPU 时间、堆栈大小、文件描述符数量等。这些常量通常以 RLIMIT_ 开头比如 RLIMIT_CPU、RLIMIT_STACK、RLIMIT_NOFILE 等。可以在系统的 sys/resource.h 头文件中找到定义。 rlim是一个指向 struct rlimit 结构的指针用于指定相应资源的软限制和硬限制。struct rlimit 结构包含两个字段 rlim_cur软限制指定了资源的软限制值。软限制是进程在不需要特权的情况下能够修改的资源限制。例如一个进程的最大打开文件数。rlim_max硬限制指定了资源的硬限制值。硬限制是由系统管理员设置的最大资源限制。如果进程试图超过硬限制系统会阻止这种行为除非进程有特权。 一般我们只会限制运行时间和空间大小 这两个参数也是由我们的题目提供。 运行功能开发代码 // 提供运行服务 #pragma once #include iostream #include unistd.h #include string #include ../comm/Log.hpp #include ../comm/util.hpp #include sys/types.h #include sys/stat.h #include fcntl.h #include wait.h #includesys/time.h #includesys/resource.h using namespace std; namespace ns_runner {using namespace ns_util;using namespace ns_log;class Runner{public:Runner(){}~Runner(){}public://设置进程资源大小的接口static void SetProcLimit(int _cpu_limit,int _mem_limit){//设置cpu时长struct rlimit cpu_rlimit;cpu_rlimit.rlim_maxRLIM_INFINITY;cpu_rlimit.rlim_cur _cpu_limit;setrlimit(RLIMIT_CPU,cpu_rlimit);//设置内存大小struct rlimit mem_rlimit;mem_rlimit.rlim_maxRLIM_INFINITY;mem_rlimit.rlim_cur_mem_limit*1024;//转化为kbsetrlimit(RLIMIT_AS,mem_rlimit);}// 指明文件名即可 不需要代理路径 不需要带后缀// 返回值int;// 返回值 0: 程序异常了退出时收到了信号返回值就是对应的信号编号// 返回值 0: 正常运行完毕的结果保存到了对应的临时文件中// 返回值 0: 内部错误//运行时间和内存限制是由出题人决定的//第二个参数static int Run(const string file_name,int cpu_limit,int mem_limit){// 程序运行三种结果// 1.代码跑完结果正确// 2.代码匏安结果不正确// 3.代码没跑完异常了// Run不需要考虑结果正确与否// 结果正确与否是由我们的正确用例决定的// 我们只考虑是否正确运行完毕//// 我们必须知道可执行程序是谁// 一个程序在默认启动的时候// 标准输入不处理不考虑用户自测情况//只可以使用我们提供的测试用例// 标准输出程序运行完成输出结果是什么// 标准错误运行时错误信息// 写入文件// 获得可执行程序的文件名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){close(_stdin_fd);close(_stdout_fd);close(_stderr_fd);LOG(ERROR)运行时创建子进程失败\n;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);int status 0;waitpid(pid, status, 0); // 程序运行异常一定是因为收到了信号LOG(INFO)运行完毕,info:(status0x7F)\n;return status 0x7F;}}}; }今天对项目运行功能开发的分享到这就结束了希望大家读完后有很大的收获也可以在评论区点评文章中的内容和分享自己的看法个人主页还有很多精彩的内容。您三连的支持就是我前进的动力感谢大家的支持!