负载均衡OJ项目中遇到的问题

1、续行符问题

关于换行符 ,代码在使用了换行符后无法编译文件,也没有爆出任何错误,更没有按照我们的代码打印出如下类似内容

:[ERROR][compiler.hpp][66][1732635247]编译失败,没有形成可执行程序

随机排查才发现。

代码中的 \续行符,用于在 C/C++ 源代码中将一行代码拆分为多行。其主要作用是告诉编译器:"当前行还没有结束,下一行是它的继续"。如果滥用或误用续行符,可能会导致代码行为异常。


删除\后又出现:

bash 复制代码
[LHL@VM-8-7-centos compile_server]$ ./compile_server
申请的进程PID:28530
申请的进程PID:0
[DEBUG][compiler.hpp][67][1732671807]./tempcode.cpp
[ERROR][compiler.hpp][68][1732671807]编译失败,没有形成可执行程序

问题,重新使用\符号,并清除后面的空格后正常。

为什么去掉 \ 后程序正常?

在你的代码中:

cpp 复制代码
execlp("g++", "g++", "-o", PathUtil::Exe(file_name).c_str(),\
       PathUtil::Src(file_name).c_str(), "-std=c++11", nullptr /*不要忘记nullptr结尾*/);
  • \ 的作用是将代码分成两行,逻辑上视为一整行。
  • 如果 execlp 的参数列表已经完整 ,则使用 \ 并不必要。
  • 如果后面的行存在多余的空格或不可见字符,execlp 的行为可能会受到影响,导致编译器或运行时处理异常。

去掉 \ 后代码变为:

cpp 复制代码
execlp("g++", "g++", "-o", PathUtil::Exe(file_name).c_str(), 
       PathUtil::Src(file_name).c_str(), "-std=c++11", nullptr /*不要忘记nullptr结尾*/);

这种情况下,每个参数显式地分开,且没有多余的续行逻辑,编译器直接处理整个语句,不会因隐藏字符问题导致错误。


续行符可能引发的问题

  1. 隐藏的空格或不可见字符

    如果 \ 后有空格或 Tab,续行符会失效,导致编译器视后续部分为单独一行。例如:

    cpp 复制代码
    execlp("g++", "g++", "-o", PathUtil::Exe(file_name).c_str(),\    
    PathUtil::Src(file_name).c_str(), "-std=c++11", nullptr);

    上面代码中,\ 后的空格会导致下一行被独立解析,参数传递失败。

  2. 滥用续行符破坏代码可读性

    使用过多的续行符会让代码变得复杂和难以维护。如果一行代码不长,尽量不要用 \

  3. 难以调试

    如果 execlp 出现问题,比如执行失败,错误日志可能无法正确定位问题原因。


  • 续行符 \ 是为分割长行代码而设计的,去掉它让代码写成单行,有助于避免隐藏字符等潜在问题。
  • 如果保留续行符,需严格检查后续行是否有多余字符。
  • 优化日志记录以便于调试参数错误。

2、umask问题

启动http服务后浏览器无法访问的问题

启动服务端后,在网页中并无法访问服务器端口,经排查原因如下:

检查云平台的安全组规则: 确保在云平台(如阿里云、AWS、腾讯云等)控制台中,安全组规则允许 8080 端口的流量通过。你需要为服务器的公网 IP(49.232.209.35)开放 TCP 端口 8080。

在云平台的控制台中,找到相应的安全组,确保添加了允许来自 任何地方(0.0.0.0/0) 或特定 IP 地址的 8080 端口 TCP 流量。

如上如所示添加相关项即可。

cpp 复制代码
#include "compiler.hpp"
#include "runner.hpp"
#include "compile_run.hpp"
#include "../comm/httplib.h"

using namespace ns_complier;
using namespace ns_runner;
using namespace ns_compile_and_run;
using namespace httplib;


/*编译服务随时可能被多个人请求,必须保证传递上来的code,
形成的源文件名称具有唯一性,否则多用户之间会相互影响
*/
int main()
{
    //提供的编译服务,打包形成一个网络服务
    //cpp-httplib
    Server svr;
    svr.Get("/hello",[](const Request &req,Response &resp){
        resp.set_content("hello httplib,你好 httplib!","content-type: text/plain;charset=utf-8");
    });
    svr.listen("0.0.0.0",8080); //启动http服务
    return 0;
相关推荐
努力学习的小廉2 小时前
深入了解linux系统—— 进程池
linux·运维·服务器
秃头菜狗2 小时前
各个主要目录的功能 / Linux 常见指令
linux·运维·服务器
jiunian_cn3 小时前
【Linux】centos软件安装
linux·运维·centos
藥瓿亭4 小时前
K8S认证|CKS题库+答案| 6. 创建 Secret
运维·ubuntu·docker·云原生·容器·kubernetes·cks
2302_809798324 小时前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
嵌入式大圣4 小时前
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
运维·docker·容器
dmy4 小时前
n8n内网快速部署
运维·人工智能·程序员
程序员JerrySUN4 小时前
全面理解 Linux 内核性能问题:分类、实战与调优策略
java·linux·运维·服务器·单片机
米粉03055 小时前
深入剖析Nginx:从入门到高并发架构实战
java·运维·nginx·架构
huangyuchi.5 小时前
【Linux】LInux下第一个程序:进度条
linux·运维·服务器·笔记·进度条·c/c++