2012-07-13 139 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"),我想。)