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. css+jquery 实现图片局部放大预览

    今天有时间开始动手,使用css+jquery实现了图片局部放大的组件,首先看看效果图: 界面设计思路如下: 1.两个div,左边放图片的缩略图 2.在左边缩略图鼠标移动的时候,区域(效果图中的网格) ...

  2. 配置VLAN

    SW1 Switch>en Switch#conf t Enter configuration commands, one per line. End with CNTL/Z. Switch(c ...

  3. SpringBoot实现跨域

    一.什么是跨域请求? 跨域请求,就是说浏览器在执行脚本文件的ajax请求时,脚本文件所在的服务地址和请求的服务地址不一样.说白了就是ip.网络协议.端口都一样的时候,就是同一个域,否则就是跨域.这是由 ...

  4. python 12

    #! /usr/bin/python a = 1 b = [2, 3] def func(): a = 2 print("in func a:", a) b[0] = 1 prin ...

  5. 关于layui中tablle 渲染数据后 sort排序问题

    最近在使用easyweb框架做后台管理,案例可见https://gitee.com/whvse/EasyWeb. 其中遇到了 sort排序问题, html代码:<table class=&quo ...

  6. Python:从入门到实践--第五章--if语句--练习

    #1.编写一系列条件测试:将每个测试以及结果打印出来 car = '宝马' if car == "宝马": print("预测正确") print(car) e ...

  7. .NET第一章

    1.介绍了.NET的作用和软件前景趋势 2.Visual studio .net 编程 3.介绍.net可以多种编程语言,通过公共语言类库存放 2.介绍C# 数据类型和变量设置,以及函数的使用 3.继 ...

  8. 使用docker构建简约高效的镜像

    背景介绍 最近在思考一个问题,我的golang运行到docker环境上的时候,需要安装很大依赖.思考发现我需要就是一个运行二进制的环境而已并不需要golang的编译器等等其他任何多余的. 当前的doc ...

  9. 虚拟机无法上网,没有eth0

    虚拟机无法上网,找不到eth0解决方案如下: Ifconfig -a 第一步,输入如下命令,编辑对应文件(使用管理员权限执行,下同) # vim /etc/default/grub 在"GR ...

  10. robotframework之用cmd去执行用例

    1.电脑cmd进入 2.在cmd中输入相应的执行命令即可以正常执行 3.执行完成,会显示当前用例执行情况,以及output/log/report的默认保存路径 接下来详细说一下执行不同用例的具体指令, ...