2

ユーザーによって送信された cpp コードがあります。データベースには入力ファイルと出力ファイルもあります。私が持っている入力ファイルと出力ファイルでこのcppコードをコンパイルして実行するにはどうすればよいですか。

さらに、上記のコードの実行の実行時間とメモリ消費を制限するにはどうすればよいですか。また、メモリの量と上記のコードの実行にかかった時間を測定するにはどうすればよいですか。

編集私はこれを以下のハックで動作させました。唯一の問題は、実行中のプログラムのメモリ使用量をどのように制限するかです。OSに依存しないものであれば幸いです。ただし、Windows と Linux の両方で解決できない場合は大歓迎です。

「タイムアウト」が必要

    runDir = 'run\\'

    def code_file( sid )
        return "#{sid}.cpp"
    end

    def executable_file( sid )
        return "#{sid}.exe"
    end

    def input_file( sid )
        return "#{sid}.in"
    end

    def output_file( sid )
        return "#{sid}.out"
    end

    def get_complie_command_line( sid , runDir)
        return "g++ -w -O2 #{code_file(sid)} -o #{runDir}#{executable_file(sid)}"
    end

    def get_run_command_line( sid , runDir )
        return "#{runDir}#{executable_file(sid)} < #{sid}.in"
    end

    def run_submission( sid , runDir )
        begin
        timeout(5) {
            run_cmd_line = get_run_command_line( 1 , runDir)
            puts run_cmd_line
            runOutput = %x[#{run_cmd_line}]
            puts runOutput
        }
        puts "Timeout didn't occur"
        rescue Timeout::Error    
            puts "Timed out!"
        end
    end

    def compile( sid , runDir )
        #make the directory 
        %x[mkdir #{runDir}]

        #get compile command line and produce the exe
        cmd_line = get_complie_command_line( 1 , runDir)
        puts cmd_line
        compile_error = %x[#{cmd_line}].to_s.strip

        #run the code
        if compile_error.length != 0 
            puts "Compile Errors"
        else
            run_submission( 1 , runDir )
        end
    end



    compile( 1 , runDir)
4

1 に答える 1

0

*nix ライクなオペレーティング システムを使用している場合は、run.sh などの Ruby コードを使用して実行スクリプトを作成できます。このスクリプトのコンテキストは次のようになります。

#!/bin/bash
/path/to/timeout /path/to/your/compiled/cpp/program < /your/stdin > /your/stdout

タイムアウト プログラムは、この perl スクリプトhttps://github.com/pshved/timeout です。時間またはメモリの制限に違反すると、プログラムが強制終了されます。run.shruby からは、run.sh スクリプト ( ) などを実行するだけです。Windowsの場合、同じアプローチを使用できます

于 2012-06-14T07:06:25.177 に答える