4.從0實現(xiàn)Online Judge(go語言)-Compiler實現(xiàn)

源碼見:https://github.com/lovercode/GO_OJ.git,demo見:https://codelover.me/run.html

Compiler的實現(xiàn)

compiler的實現(xiàn)比較簡單,直接調(diào)用 compile.sh編譯代碼就行,編譯期的安全,可以在腳本中限制,同時可以限制編譯的運行時間。
OJ技術(shù)思考:評測安全




var consumer *mq.MqConsumer
var producer *mq.MqProducer

func init() {
    consumer = mq.NewMqConsumer(conf.GlobalConfig.CompilerConsumer)
    producer = mq.NewMqProducer(conf.GlobalConfig.RunProducer)
}
func main() {
    for data := range consumer.Ch {
        go compile(data)
    }
    ch := make(chan int)
    <-ch
}
func compile(data []byte) {
    pro := &problem.Problem{}
    e := proto.Unmarshal(data, pro)
    if e != nil {
        log.Println("解析錯誤")
        return
    }
    topic, has := conf.GlobalConfig.RunConfig[fmt.Sprintf("%d", pro.GetType())]
    if !has {
        log.Println("沒有找到相關(guān)配置")
        return
    }
    cmd := exec.Command("/bin/sh", "./compile.sh", pro.GetUuid())
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    cmd.Dir = conf.GlobalConfig.WorkDirPre + "/" + pro.GetUuid()
    err := cmd.Run()

    if err != nil {
        bytes, err := ioutil.ReadFile(conf.GlobalConfig.WorkDirPre + "/" + pro.GetUuid() + "/compiler_err.msg")
        if err != nil {
            pro.ErrMsg = "獲取編譯信息失敗"
        } else {
            pro.ErrMsg = string(bytes)
        }
        pro.Status = problem.Status_Compile_Error
        notifyOther(pro)
        log.Println("編譯錯誤", err)
        return
    }
    pro.Status = problem.Status_Running
    info, e := proto.Marshal(pro)
    if e != nil {
        panic(e)
    }
    log.Printf("%s:compile cost:%dms\n", pro.GetUuid(), time.Now().UnixNano()/1000000-pro.GetCreateTime())
    producer.MqPublish(topic.RunTopic, string(info))

}

func notifyOther(pro *problem.Problem) {
    info, e := proto.Marshal(pro)
    if e != nil {
        panic(e)
    }
    producer.MqPublish(conf.GlobalConfig.RunEndTopic, string(info))

}

編譯完就可以通知runner

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容