2012-02-03 59 views
2

我正在努力讓一名在線評委寫出PHP。我的代碼目前的樣子:如何強制執行`exec()`調用的時間限制?

exec("gcc /var/www/qwerty.c -o /var/www/binary",$output,$returnval); 
print_r($output); 
exec("cat /var/www/qwe.txt | /var/www/binary",$output,$returnval); 
print_r($output); 

不過,我想通過exec催生了擁有最多1秒到運行的每個過程。我不知道如何做到這一點。 set_time_limit()函數不工作

+2

世界什麼? – MetalFrog 2012-02-03 12:51:50

+0

見證,如果你願意,我對問題標題的改進。 – 2012-02-03 12:52:32

+0

@ManseUK:閱讀該頁面:'set_time_limit()函數和配置指令max_execution_time僅影響腳本本身的執行時間。在確定腳本運行的最長時間時,不包括使用system()系統調用,流操作,數據庫查詢等腳本執行之外發生的任何活動時間。在測量時間是真實的Windows上,這不是事實。 ' – 2012-02-03 12:54:36

回答

4

你也許可以使用ulimit爲:如果該進程使用主動CPU時間,而不是是否等待I/O不休

exec(" (ulimit -t 1 ; gcc ... | /var/www/binary) "); 

那當然只適用。

3

這可以使用proc_功能家族來實現。使用proc_open啓動您的流程。反覆使用proc_status(在兩次輪詢之間有一些小的睡眠)進行輪詢,直到過程返回或1秒鐘過去。如果1秒內未通過proc_status表明過程已完成,請使用proc_terminate(或proc_close)將其關閉並採取適當的措施。但我並不是說在PHP腳本中產生外部進程是一個不錯的主意。

6

我會用proc_功能通過@Adam賴特的建議,但迅速替代類似Linux的環境是你的命令之前使用GNU timeout命令:

// If it took more than 1 second, $returnval will got the exit code 124 
exec('timeout 1 gcc /var/www/qwerty.c -o /var/www/binary', $output, $returnval);