我正在编写一个通过互联网运行用户代码的C#应用程序。用户代码通过HTTP post请求发送到应用程序,并在服务器上处理(编译,然后执行,或直接执行python,lua,php等语言)。我使用以下代码来读取运行用户代码(编译的二进制文件或解释器)的进程的输出:
Thread readThread = new Thread(() =>
{
char[] buffer = new char[Console.BufferWidth];
int read = 1;
while (read > 0)
{
read = p.StandardOutput.Read(buffer, 0, buffer.Length);
string data = read > 0 ? new string(buffer, 0, read) : null;
if (data != null)
env.ClientSock.Send(data);
Thread.Sleep(10);
}
});
readThread.Start();
其中p
是运行用户代码的进程,env.ClientSock
是用于将输出发送给用户的Web套接字。用户可以通过同一个Web套接字写入进程的标准输入流。
这适用于应用程序支持的大多数语言(C#,VB,C ++,Python,PHP,Java)。但是,对于C和Lua,如果用户的代码涉及从标准输入流中读取,则在给出任何输出之前,此读取操作将阻塞。
例如,以下C程序:
#include <stdio.h>
int main(){
printf("Hello, World!");
int i;
scanf("%d", &i);
return 0;
}
在用户提供输入之前,不会打印任何内容。对于C,我使用的是Visual Studio附带的MSVC编译器。运行Lua代码时会出现同样的问题:
io.write("Hello World!")
io.read()
在用户输入一些输入之前,不会打印任何内容。我无法弄清楚为什么会发生这种情况,我希望我的应用程序能够正确支持C和Lua。使用Python 2.7也存在这个问题,尽管我忽略了这一点,因为Python 3按预期工作。
为什么会这样?我该如何解决?