2012-05-19 48 views
3

我正在尋找一種方法來評分C++程序。使用Perl或C++運行程序

我希望能夠執行許多程序,這些程序將具有標準的輸入/輸出路徑,因此每個程序都需要在適當的時間輸出和輸入信息。

這樣做的最好方法是什麼?我看到有人說寫一個調用fork()的C++程序,但是我的問題是如何與相同的輸入和輸出屏幕交互? (換句話說,一旦你分叉了那個進程,你能餵給那個進程輸入並查看它的輸出嗎?)一個perl腳本會更好地工作嗎?

如果是這樣,你能給我幾行perl腳本和它的樣子。

+2

Perl有一個名爲Expect的模塊,它有助於Perl與外部應用程序中的stdio提示和輸入交互。 Expect :: Simple具有更容易使用的接口,並且Test :: Expect允許您輕鬆創建必須滿足的斷言,然後使用Expect對其進行測試。但是,這些模塊在非Windows環境下工作得最好。 – DavidO

+2

[期望](http://p3rl.org/Expect)適用於想要驅動的程序需要僞終端的情況。該描述僅提到stdin/stdout,對此[IPC :: Run](http://p3rl.org/IPC::Run)或[IPC :: Open3](http://p3rl.org/)的適度方法IPC :: Open3)已經足夠。 – daxim

+0

@daxim:這是一個很好的觀點。在這種情況下,我仍然想建議一個Test :: module來驅動斷言的測試。即使將Test :: More與IPC :: Run或IPC :: Open3結合使用,也可以輕鬆驗證目標代碼是否符合規範。 – DavidO

回答

1

您應該使用Posix popen或open3來打開程序,並使用它的stdin和stdout進行交互。你應該可以用任何語言來做到這一點;我個人會使用Ruby和rspec來進行評分。

http://pubs.opengroup.org/onlinepubs/009604499/functions/popen.html

一定要受限制的權限運行該學生的代碼作爲用戶和使用chroot監牢!

+0

非常感謝!這將幫助一大堆!我實際上是一個更好的Java程序員,你的信息幫助我實現了基本上完成相同事情的Java Process對象。感謝您的幫助! – Matthew