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 则代表实际结果正确了。

hustOJ 添加 golang 支持的更多相关文章

  1. 把自己Github上的代码添加Cocoapods支持

    转载请注明原链接:http://www.cnblogs.com/zhanggui/p/6003481.html 一.前言 这两天被cocoapods折磨的心力憔悴.看cocoapods官网的添加支持, ...

  2. Spring Boot 添加Shiro支持

    前言: Shiro是一个权限.会话管理的开源Java安全框架:Spring Boot集成Shiro后可以方便的使用Session: 工程概述: (工程结构图) 一.建立Spring Boot工程 参照 ...

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

    问题描述 第一次在Add Frameworks support界面中添加hibernate支持的时候,异常中断,导致没有成功添加. 第二次进入Add Frameworks support窗口时,发现找 ...

  4. 别再为了iOS新系统设备而重新安装一个新版Xcode了.其实我们可以添加版本支持

    众所周知,Xcode7.3的代码补全是有问题的  如导入自定义类之后,在代码中并不会补全相应的类名... 但Xcode7.2是没有这个问题的,但很多时候我们自己的设备都升级到了iOS9.3.X系统,导 ...

  5. 将自己库添加Cocoapods支持

    给库添加Cocoapods支持, 使这个工具使用起来更加方便, 更好的使用Cocoapods, 助力iOS程序开发, 下面进入正题, 想要实现这个过程, 绝对不虚此读. 首先写好一个要添加Cocoap ...

  6. net-snmp源码VS2013编译添加加密支持(OpenSSL)

    net-snmp源码VS2013编译添加加密支持(OpenSSL) snmp v3 协议使用了基于用户的安全模型,具有认证和加密两个模块. 认证使用的算法是一般的消息摘要算法,例如MD5/SHA等.这 ...

  7. net-snmp源码VS2013编译添加加密支持(OpenSSL)(在VS里配置编译OpenSSL)

    net-snmp源码VS2013编译添加加密支持(OpenSSL) snmp v3 协议使用了基于用户的安全模型,具有认证和加密两个模块. 认证使用的算法是一般的消息摘要算法,例如MD5/SHA等.这 ...

  8. Auty自动化测试框架第六篇——垃圾代码回收、添加suite支持

    [本文出自天外归云的博客园] 垃圾代码回收 添加脚本恢复机制,因为框架会自动生成一些代码,如果代码生成后出现问题导致代码没有正常删除掉,则会造成代码垃圾,在auty目录添加recovery.py文件: ...

  9. 为python-sproto添加map支持

    上个月太忙了,做完这个修改还没写博客,现在补一下.. 之前使用protobuf做协议打包的时候,经常会有个痛点,没法用具体数据的值作为key来索引数据.比如现在客户端上传了造兵协议,协议大概长这样: ...

随机推荐

  1. Linux常用命令练习

    实验结论 熟悉命令倒不是什么难的过程,很容易就能跟着指示打出来并明白其效果与作用.难就难在了感受不到这些命令的实际意义,即如何有效的结合起来并在项目中运用,这就导致了很大的迷茫与无力感. cat fi ...

  2. react-native-printer

    react-native-printer A React Native Library to support USB/BLE/Net printer for Android platform Inst ...

  3. [ 随手记 5 ] C/C++ 继承

    个人理解: 继承:(意译)继续承接: A继承B,则A是派生类/子类,B为基类/父类: B有的成员变量/性质,A全部都有,而A有的B不一定有,在数学集合上可以说:B是A的子集: A继承B,可以说是A在B ...

  4. Python学习之路基础篇--07Python基础+编码、集合 和 深浅Copy

    1 小数据池(节省内存) 只有数字和字符串中内存,储存在同一个内存地址中 数字的范围在-5~256中,字符串有以下两个特点:不能含有特殊字符,还有就s*20 不是同一个地址,而要*21就不是了 2 编 ...

  5. PHP常用函数(一):数组常用函数

    1.list() list() 和 array() 一样,不是一个函数,而是一个语言结构,作用是为一组变量赋值.  PHP手册中的介绍 使用详情 <?php //假设现在想为$a $b $c三个 ...

  6. Spring Boot程序的执行流程

    Spring Boot的执行流程如下图所示:(图片来源于网络) 上图为SpringBoot启动结构图,我们发现启动流程主要分为三个部分,第一部分进行SpringApplication的初始化模块,配置 ...

  7. Maven&&Philosophy~

    What is Maven? At first glance Maven can appear to be many things, but in a nutshell Maven is an att ...

  8. Servlet中的编码问题

    对于response.setContentType()和response.setCharacterEncoding()的理解: 经过一些实践,对着两个方法有了一些自己的理解,有可能今后的学习中会发现自 ...

  9. Linux 的基本命令

    Linux 的基本命令 1. 文件操作 a) Windows 是多根的文件系统,物理上是 1 到多块硬盘,逻辑上分为 C.D.E……盘, 每个盘都是一棵树.Linux 是单根的文件系统,不分 CDE ...

  10. 公司内网接口ip城市查询分析

    require 'rubygems' require 'json' print ARGV print "fist is :",ARGV[0] logfile="#{ARG ...