-1

我正在尝试在 linux 机器上使用 gcc 通过我的 php 脚本编译 C 代码。但是如果 C 代码包含无限循环,编译器就会卡住。

我的 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)**

我试过超时 5s : $output=shell_exec('./output');

但它不起作用,虽然如果我这样做它会起作用..

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

..在我的 input.c 文件中。我已经搜索了很多但徒劳无功..我做错了什么.?

4

4 回答 4

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
  }
} 
于 2012-07-13T05:49:23.833 回答
1

您可以ulimit在程序的调用中使用。例如,以下将限制output为 1 秒的 CPU 时间:

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

限制其他资源也可能是个好主意,这样output就不能使用所有的内存等。

(请注意,这限制了 CPU 时间,而不是绝对时间。如果你想这样做,你应该看一个类似 的程序,我认为timelimit它会被称为类似。)shell_exec("timelimit -T 1 ./output")

于 2012-07-13T06:45:23.410 回答
0

您正在寻找的东西在理论上是可能的:

您可以阅读有关停止问题的信息

但是,您可能可以使用 PHP 的 set_time_limit 之类的东西

于 2012-07-13T06:17:54.677 回答
0

杰伊很好地解释了其中的大部分内容。剩下的就是你的第一个程序不仅进入了一个无限循环,而且还产生了无限量的输出,所有这些你都试图存储在 $output 中。我会说你很幸运你没有让你的电脑崩溃,但是 PHP 可能用一个内置的内存限制来救你。

于 2012-07-13T05:54:58.287 回答