【发布时间】:2013-04-27 09:47:28
【问题描述】:
我正在尝试建立一个人们可以在线编译和运行代码的网站,因此我们需要找到一种交互方式让用户发送指令。
其实首先想到的是exec()或者system(),但是当用户想输入某事时,这种方式是行不通的。所以我们必须使用proc_open()。
比如下面的代码
int main()
{
int a;
printf("please input a integer\n");
scanf("%d", &a);
printf("Hello World %d!\n", a);
return 0;
}
当我使用proc_open()时,像这样
$descriptorspec = array(
0 => array( 'pipe' , 'r' ) ,
1 => array( 'pipe' , 'w' ) ,
2 => array( 'file' , 'errors' , 'w' )
);
$run_string = "cd ".$addr_base."; ./a.out 2>&1";
$process = proc_open($run_string, $descriptorspec, $pipes);
if (is_resource($process)) {
//echo fgets($pipes[1])."<br/>";
fwrite($pipes[0], '12');
fclose($pipes[0]);
while (!feof($pipes[1]))
echo fgets($pipes[1])."<br/>";
fclose($pipes[1]);
proc_close($process);
}
在运行 C 代码时,我想获取第一个 STDOUT 流,并输入数字,然后获取第二个 STDOUT 流。但是,如果我将注释行取消注释,该页面将被阻止。
有没有办法解决这个问题?当并非所有数据都放在那里时,如何从管道中读取?或者有没有更好的方法来编写这种交互式程序?
【问题讨论】:
-
您的“用户”是否通过网站进行交互?因为通过这种方式,用户似乎无法直接访问您服务器的
STDIN。 -
@Passerby 用户按下按钮编译,输入x,发送到服务器。但在他输入 x 之前,服务器必须先从
STDIN获取流并将其发送到网站,以便用户知道他应该输入 x。问题是服务器此时无法获取流..