2012-07-13 141 views
-1

我試圖通過使用Linux機器上的gcc我的PHP腳本編譯C代碼.c文件的編譯GCC超時。但是如果C代碼包含無限循環,則編譯器會陷入困境。如何設置在Linux上

我的PHP腳本是這樣的..

shell_exec('gcc input.c -o output 2> compile.txt'); 
$output=shell_exec('./output'); 

的 'Input.c中' 文件是這樣的..

#include<stdio.h. 
void main() 
{ 
     while(1) 
     prinf("This is infinite loop"); 
} 

當我編譯PHP代碼,它提供了一個

**PHP Fatal error: Out of memory (allocated 403177472) (tried to allocate 804896768 bytes)** 

我試過timeout 5s: $ output = shell_exec('./ output');

,但它不工作,但它的工作原理,如果我做的..

int i; 
while(1) 
{ 
     scanf("%d",&i); 
} 

..in我Input.c中的文件。我已經找到了很多,但徒勞無功.. 我在做什麼錯。

+0

閱讀你的問題我看你想做什麼,但我不明白爲什麼。你可能會嘗試解釋一下,可能有更好的方法來做你想做的事情。不知道你想做什麼,很難說你做錯了什麼。你是否想用php代替makefile? – 2012-07-13 05:44:50

+0

您是否正在尋找超時的PHP解決方案,或者您是否希望c程序退出? – eyalm 2012-07-13 05:45:36

+0

你確定代碼中的無限循環會掛起**編譯器**嗎? – 2012-07-13 05:52:51

回答

1

第一點是,它不是被卡住的編譯器。編譯器編譯好的代碼。在執行過程中,您的代碼將進入無限循環。因此,櫃面你的第一個代碼,它只是不斷沒有任何停頓或退出和豬的CPU執行所有這些都給出了「被卡住」的感覺的時間。

關於你的第二個代碼是如何工作的,這是因爲你被暫停用於獲取輸入。但是,在這種情況下,您又無法爲您的程序提供退出。因此,第二個代碼與第一個代碼相同,但它不會佔用CPU。

只有一個,爲您解決此問題的方法,即通過修改你的「C」代碼,不要有沒有任何退出無限循環。

例子:

int i; 
while(1) 
{ 
    scanf("%d",&i); 
    if(0 == i) 
    { 
    break; //Just an example as to how you can exit from an infinite loop 
    } 
} 
+0

Thanx回覆@jay .. 我知道無限循環是一個問題,但我想使編譯足夠好來處理這種類型的代碼。 我不是在控制c代碼,我想讓編譯器處理它,這就是爲什麼當這樣的條件滿足或者可能是內存分配限制時,我想超時gcc。 – mayurvir 2012-07-13 05:58:19

+0

編譯器不能也不檢查你的邏輯。在這種情況下,您的代碼的邏輯有問題。所以,在這個代碼中你可以用gcc做任何事情來糾正這個問題。 – Jay 2012-07-13 06:03:59

+0

有些網站可以讓你編譯你的代碼,任何人都可以發佈任何代碼。他們將如何處理這種情況。 – mayurvir 2012-07-13 06:09:42

0

周杰倫解釋太多的非常好。它的其餘部分是你的第一個程序,不僅進入一個無限循環,但也產生輸出的無限量,所有這些嘗試在$輸出到存儲。我會說你很幸運,你沒有讓你的電腦死機,但是PHP可能爲你保存了一個內置的內存限制。

0

你所尋找的是理論上的可能:

You can read about the halting problem

然而,你也許可以使用類似PHP的參數或者set_time_limit

+0

set_time_limit()設置整個腳本的時間限制。此外,問題是當我從linux shell(shell_exec)執行'output'文件時 – mayurvir 2012-07-13 06:26:36

1

您可以在程序的調用使用ulimit。例如。下面將限制output 1的CPU時間第二:

shell_exec("ulimit -t 1; ./output") 

這可能是一個好主意,限制其他資源也讓output不能使用所有你的記憶等

(請注意,這限制了CPU時間,而不是絕對的時間,如果你想這樣做,你應該看看像timelimit一個計劃,該計劃被稱爲像shell_exec("timelimit -T 1 ./output"),我想。)