hustOJ 添加 golang 支持

hustOJ 支持Go1.7.1

是否为docker环境不重要,此处所有内容均为docker中执行,普通主机手动安装则更加如此

建议在docker中执行,因为OJ为严控恶意权限,judge_client做了很多特殊指令

hustOJ 虽然有部分代码涉及到了golang
但,实际还无法正常执行。

本次支持的是go 1.7.1

关键改动都在core组件里面的judge_client

系统修改

  1. 配置apt使用清华大学镜像下载golang

文件 /etc/apt/sources.list

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ jessie main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ jessie main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ jessie-updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ jessie-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ jessie-backports main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ jessie-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security jessie/updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security jessie/updates main contrib non-free

安装 golang

apt-get install golang-1.7.1

改动点:

  1. okcalls64.h

在数组里面增加 186 信号,baidu说,此信号实际对应值是:186 gettid

如果不增加,golang编译的程序会被judge_client fork 出的parent监控并停止。

int LANG_GOV[256]={0,1,9,11,13,14,56,59,131,158,186,202,204,228,231,0};
  1. judge_client.cc

copy_js_runtime 函数后,新增函数 copy_go_runtime


void copy_go_runtime(char *work_dir) {
    char envbuff[1024] = {0};

    copy_shell_runtime(work_dir);

    execute_cmd("/bin/mkdir %s/usr", work_dir);
    execute_cmd("/bin/mkdir %s/usr/lib", work_dir);
    execute_cmd("/bin/mkdir %s/usr/bin", work_dir);
    // execute_cmd("/bin/cp /usr/lib/go-1.7/bin/go %s/usr/bin/", work_dir);
    putenv((char *)"GOROOT=/usr/lib/go-1.7");
    sprintf(envbuff, "GOPATH=%s", work_dir);
    putenv(envbuff);
}
  1. 修改 int compile(int lang, char *work_dir) 函数
// 此处为方便,直接写死了go-1.7的绝对位置
// 主要judge_client在执行真正的程序前,会先执行很多环境准备
// 甚至包括chroot指令
// 最终导致环境混乱
const char *CP_GO[] = { "/usr/lib/go-1.7/bin/go", "build", "-o", "Main", "Main.go", NULL };
  1. 修改 main 函数
int main(int argc, char **argv) {
    // init_parameters
    // init mysql
    // get_solution_info
    // compile

    // 根据逻辑相关部分新增如下函数
    // copy_go_runtime
  1. make it
cd /home/judge/src/core/judge_client/
make
  1. 单独测试 golang 程序

可以用go源码提交一份其它语言的程序到题目中,此程序会被存储到数据库,
并分配一个solution_id,假设其为1008.

登录数据库,修改其语言为go

mysql -udebian-sys-maint -paaabbb

> use jol;
> update solution set language=17 where solution_id = 1008;
> commit;

以上sql为手写,假装正确

然后手动执行 judge_client

/home/judge/src/core/judge_client/judge_client 1008 1 /home/judge/ debug

如果,最后输出 result=4 则代表实际结果正确了。

原文地址:https://www.cnblogs.com/morya/p/9697329.html

时间: 2024-07-29 15:55:53

hustOJ 添加 golang 支持的相关文章

为UiAutomatorViewer添加xpath支持

UiAutomatorViewer是Android SDK自带的测试工具,用来查看手机或模拟器上的界面元素,小巧,简单,开箱即用,十分方便.美中不足之处在于,它不能获取界面元素的xpath. 写自动化测试脚本时,xpath是一种非常方便的定位方式.Appium等一些成熟的工具框架可以获取到界面元素xpath,但使用起来稍有点重量级.那么是否也可以给UiAutomatorViewer添加xpath支持呢? 答案是肯定的. 首先下载UiAutomatorView源代码,我用的地址是https://a

为Gradle添加UTF-8支持

gradle默认使用系统字符编码,大多数中文系统是使用GBK编码 但程序员绝大部分都是使用UTF-8写各类java文件以及其他资源文件 编译时很容易报错,比如下面的错误: ”警告:编码 GBK 的不可映射字符“ 有两种办法可以给gradle添加UTF-8支持 第一种,在我们的项目配置文件build.gradle中最后添加下面的语句 tasks.withType(JavaCompile) { options.encoding = "UTF-8" } 这样,这个项目在进行gradle打包时

为UIAlertView添加block支持

系统自带的UIAlertView只能支持delegate方式. 如果你只有一个UIAlertView这种方式可能无关紧要. 但如果你有二个或多个UIAlertView, 你需要在委托方法中进行判断是哪个UIAlertView实例的产生的委托, 接着又要判断是响应哪个button. 如果你曾经这样做过, 想想这是多杂的代码. Objective-C是支持块代码的, 如果对UIAlertView添加块支持, 那岂不是一个美事. 这里推荐一个开源的实现: https://github.com/jiv

Ubuntu下安装VirtualBox并为其添加USB支持

1.下载VirtualBox软件包和USB支持包 下载网址均为为:https://www.virtualbox.org/wiki/Downloads VirtualBox软件包下载项: VirtualBox 4.3.10 for Linux hosts USB支持包下载项: VirtualBox 4.3.10 Oracle VM VirtualBox Extension Pack All supported platforms 2.下载完成后,进行安装 3.添加当前用户到组 sudo gedit

Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)

Internationalization with Qt 应用程序的国际化就是使得程序能在国际间可用而不仅仅是在本国可用的过程. Relevant Qt Classes andAPIs 以下的类支持Qt的国际化. QTextCodec QTextDecoder QTextEncoder QTranslator QLocale Languages and WritingSystems 有时,国际化是比较简单的,例如,把美国的应用程序让澳大利亚或英国的用户可访问,只需要简单的改变拼写.但是,把美国的

在IntelliJ IDEA中添加框架支持时找不到Hibernate的解决办法

问题描述 第一次在Add Frameworks support界面中添加hibernate支持的时候,异常中断,导致没有成功添加. 第二次进入Add Frameworks support窗口时,发现找不到hibernate. 解决办法 打开项目根目录下的spring-mvc-crud.iml文件,搜索hibernate找到这段代码并删除,然后重新添加框架支持即可选择hibernate. <facet type="hibernate" name="Hibernate&qu

为Vim 添加vimgdb支持

为Vim 添加vimgdb支持 1.    下载最新的vim74的源码包 wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2 2.下载vimgdb-for-vim7.4源码 wget https://github.com/larrupingpig/vimgdb-for-vim7.4/archive/master.zip -O vimgdb-for-vim74.zip 3.解压所有文件,并应用补丁文件 tar xjvf vim-7.4.tar.b

Mybatis添加Ehcache支持

1.Mybatis默认的缓存配置 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制. Mybatis缓存包含全局的缓存和局部的缓存,全局的缓存可以讲主配置文件的setting属性的参数cacheEnabled设置为true(好吧,默认为true), 局部的二级缓存默认情况下是没有开启的,要开启二级缓存,你需要在你的 SQL 映射文件中添加一行: <cache/> eviction(回收策略) 默认的是 LRU.可选择项有FIFO,SOFT,WEAK flushInte

java-cef系列视频第三集:添加flash支持

上一集我们介绍了如何搭建java-cef调试环境. 本视频介绍如何给java-cef客户端添加flashplayer支持 本作品采用知识共享署名-非商业性使用-禁止演绎 3.0 中国大陆许可协议进行许可.