进程在写入输出之前等待输入

时间:2018-03-03 13:56:23

标签: c# process inputstream

我正在编写一个通过互联网运行用户代码的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按预期工作。

为什么会这样?我该如何解决?

0 个答案:

没有答案