2012-03-22 5 views
1

私は一連のcppソースファイルを持っており、正しく実行できる(入力を与え、出力をstandart出力と比較する)なら、JUDGEに別のプログラムを書きたいと思っています。それでは、どのように:cpp経由で他のプログラムの結果を判断する方法は?

  1. コール/別のプログラムを起動し、与えるファイルが
  2. 制限時間と子プロセスのメモリの標準入力する(?多分はsetrlimit事どんな例がありますか?)
  3. その標準出力
  4. するファイルを使用し
  5. 任意のファイルの書き込み/プロセスが読み聞かせDONOTを標準出力に出力を比較します。

私は2番目と3番目がこのprobの中核部分だと思います。これを行う方法はありますか?

ps。システムは、Linux

+0

オペレーティングシステム? –

+4

あなたはおそらく、シェルスクリプトを使ってすべてのことを行うことができます.C++で自分自身を打ち負かす必要はありません。 './program output.txt; if cmp output.txt known-good.txt;エコー "yay"; fi' –

+0

あなたの弾丸のそれぞれは別の質問でなければなりません。あなたはすぐにあまりにも多くの異なることを求めています。 – mfontanini

答えて

2

forkで子プログラムを作成したい場合は、systemではありません。

これにより、いくつかのことができます。まず、親が親プロセスにいくつかのパイプを設定して、親が入力を子に提供し、子の出力をキャプチャして期待される結果と比較することができます。

第2に、setreuidのような親密な親戚の1つであるseteuidを呼び出すと、子プロセスが非常に限られたユーザーアカウントで実行されるように設定し、ファイルに書き込まれないようにします。 forkが親で返されるときは、子のCPU使用を制限するためにsetrlimitを呼び出すとよいでしょう。

子供の出力をファイルに出力するのではなく、期待される出力と比較するだけで、子供の出力を親パイプに直接取り込むことができます。そこから親は必要に応じてデータをファイルに書き込むことができますが、ファイルを経由することなく、期待どおりの出力を直接比較することもできます。

1
std::string command = "/bin/local/app <my_input.txt> my_output_file.txt 2> my_error_file.txt"; 
int rv = std::system(command.c_str()); 
+1

あなたは私の答えの後に質問を変更しました。 "ファイルを読み書きするためのプロセスを「標準出力にする」「ファイルを標準入力にする」というコンフリクトにはなりません。それはファイルの読み書きです。 – 01100110

0

1)基本的にいるかのようにシェルから呼び出されたプログラムを実行することができますSTLからsystem機能()です。このアプローチは厳密には安全ではないため、信頼できる環境でのみ使用してください。
2)これを実現するにはスレッドを使用する必要があります。 C++にはいくつかのスレッドライブラリが用意されていますが、お勧めできません。
[OPの投稿で編集後]
3)これは難しいです。ファイルへの読み書きアクセスを監視するラッパーを作成するか、ファイルにアクセスできないようにLinux/Unix特権魔法を実行する必要があります。
4)通常はプログラムを呼び出す方法の後に> outFile.txtを追加することで、プログラムの出力を標準出力に転送することができます(1)参照)。 otherapp > out.txt
5)保存されたファイル(3から)にdiffを実行して、別のファイルに取り込まれた「標準」/期待出力に実行できます。または、あなたのニーズに合った他の方法を使用することもできます(たとえば、 "コンテンツ"が存在する限り、特定のフォーマットについて気にする必要はありません)。 - この部分は本当にあなたのニーズに依存しています。 diffは基本的な比較ジョブをよくします。

関連する問題