使用D控制交互过程

Ath*_*lex 5 d

我有一个程序等待一行标准输入,然后,在处理它(需要相当长的时间)后,会发出一个答案.程序将接受输入,直到输入流关闭.

我怎么能从D控制该程序?换句话说,我怎么可能

  1. 为子进程提供一系列标准输入.
  2. 等待子进程回答.
  3. 重复一遍,直到我耗尽了我想给它的输入.

我尝试了以下代码,但毫不奇怪,它等待子进程完全完成,然后一次打印输出:

module main;

import std.file;
import std.path;
import std.process;
import std.stdio;

void main(string[] args)
{
    string[] inputs = ["test string 1", "test string 2"];

    auto pipes = pipeProcess(buildPath(getcwd(), "LittleTextProcessingApp"), Redirect.all);
    scope(exit) wait(pipes.pid);

    foreach(input; inputs)
    {
        pipes.stdin.writeln(input);
    }
    pipes.stdin.close;

    foreach(line; pipes.stdout.byLine)
    {
        writeln(line);
    }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,它会在一秒钟的延迟后打印出来,

以下是500毫秒前输入的:测试字符串1
以下是500毫秒前输入的:测试字符串2

所需的行为是它打印

以下是500毫秒前输入的:测试字符串1

半秒后,第二行500毫秒后.

我作为子进程测试的程序的源代码如下:

module main;

import std.stdio;
import core.thread;

void main(string[] args)
{
    foreach(input; stdin.byLine)
    {
        auto duration = 500.msecs;
        stderr.writefln("Doing something for %s....", duration);
        Thread.sleep(duration);
        writefln("The following was input %s ago: %s", duration, input);
    }
}
Run Code Online (Sandbox Code Playgroud)

Gas*_*ssa 4

罪魁祸首是子进程。之后writefln,默认情况下不刷新输出。相反,它保存在缓冲区(几千字节长)中。这是常见技术(并非 D 所特有),例如,在将大文件以大量少字节块写入 HDD 时,可以大大提高速度。

要刷新缓冲区,请stdout.flush()在每次希望输出立即出现时使用。在子示例代码的最后一行之后添加该行writefln可以修复示例中的情况。