负载均衡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;
相关推荐
小草cys15 小时前
在 openEuler 上安装 DDE 图形桌面环境(适用于华为鲲鹏服务器/PC)
运维·服务器
天才奇男子1 天前
HAProxy高级功能全解析
linux·运维·服务器·微服务·云原生
小李独爱秋1 天前
“bootmgr is compressed”错误:根源、笔记本与台式机差异化解决方案深度指南
运维·stm32·单片机·嵌入式硬件·文件系统·电脑故障
Dying.Light1 天前
Linux部署问题
linux·运维·服务器
S19011 天前
Linux的常用指令
linux·运维·服务器
萤丰信息1 天前
AI 筑基・生态共荣:智慧园区的价值重构与未来新途
大数据·运维·人工智能·科技·智慧城市·智慧园区
小义_1 天前
【RH134知识点问答题】第7章 管理基本存储
linux·运维·服务器
运维小欣1 天前
Agentic AI 与 Agentic Ops 驱动,智能运维迈向新高度
运维·人工智能
_运维那些事儿1 天前
VM环境的CI/CD
linux·运维·网络·阿里云·ci/cd·docker·云计算
Trouvaille ~1 天前
【Linux】UDP Socket编程实战(一):Echo Server从零到一
linux·运维·服务器·网络·c++·websocket·udp