hustOJ 添加 golang 支持

hustOJ 支持Go1.7.1

是否爲docker環境不重要,此處全部內容均爲docker中執行,普通主機手動安裝則更加如此mysql

建議在docker中執行,由於OJ爲嚴控惡意權限,judge_client作了不少特殊指令golang

hustOJ 雖然有部分代碼涉及到了golang
但,實際還沒法正常執行。sql

本次支持的是go 1.7.1docker

關鍵改動都在core組件裏面的judge_clientshell

系統修改

  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_runtimeui

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 則表明實際結果正確了。

相關文章
相關標籤/搜索