parent
0e2b49a6a1
commit
3c8ffd07ee
@ -1,72 +0,0 @@
|
|||||||
// 编译模块
|
|
||||||
#pragma once
|
|
||||||
#include "./comm/util.hpp"
|
|
||||||
|
|
||||||
|
|
||||||
namespace ns_compile
|
|
||||||
{
|
|
||||||
// 提供编译接口
|
|
||||||
class Compiler
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Compiler()
|
|
||||||
{}
|
|
||||||
~Compiler()
|
|
||||||
{}
|
|
||||||
|
|
||||||
// 编译文件,并且返回编译结果
|
|
||||||
bool compile(const std::string& file_name)
|
|
||||||
{
|
|
||||||
pid_t id = fork();
|
|
||||||
if (id == -1)
|
|
||||||
{
|
|
||||||
// 创建失败
|
|
||||||
lg(Error, "编译文件时创建子进程失败, errno:%d, strerror:%s\n",errno, strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
else if (id == 0)
|
|
||||||
{
|
|
||||||
// child
|
|
||||||
umask(0);
|
|
||||||
int _stderr = open(ns_util::pathUtil::compilerError(file_name).c_str(), O_CREAT | O_WRONLY, 0664);
|
|
||||||
if (_stderr < 0)
|
|
||||||
{
|
|
||||||
lg(Error, "子进程创建_stderr时出错, errno:%d, strerror:%s\n",errno, strerror(errno));
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
int ret = dup2(_stderr, 2);
|
|
||||||
if (ret == -1)
|
|
||||||
{
|
|
||||||
lg(Error, "子进程标准错误重定向错误, errno:%d, strerror:%s\n",errno, strerror(errno));
|
|
||||||
exit(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 进程替换
|
|
||||||
execlp("g++", "g++", "-o", ns_util::pathUtil::exe(file_name).c_str(), ns_util::pathUtil::src(file_name).c_str(), "-D", "COMPILER_ONLINE", "-std=c++11", nullptr);
|
|
||||||
|
|
||||||
lg(Error, "进程替换错误, errno:%d, strerror:%s\n",errno, strerror(errno));
|
|
||||||
exit(4);
|
|
||||||
}
|
|
||||||
else if (id > 0)
|
|
||||||
{
|
|
||||||
// parent
|
|
||||||
waitpid(id, nullptr, 0);
|
|
||||||
|
|
||||||
if (ns_util::fileUtil::isFileExist(ns_util::pathUtil::exe(file_name)))
|
|
||||||
{
|
|
||||||
lg(Info, "%s 文件编译成功!\n", ns_util::pathUtil::src(file_name).c_str());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
lg(Error, "%s 文件编译失败!\n", ns_util::pathUtil::src(file_name).c_str());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 意料之外的情况
|
|
||||||
lg(Debug, "compile创建子进程出现意料之外的情况\n");
|
|
||||||
exit(5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
Loading…
Reference in new issue