On Wednesday, 10 October 2018 at 09:16:43 UTC, Gorker wrote:
On Wednesday, 10 October 2018 at 08:31:36 UTC, Kagamin wrote:
Maybe read them with parallelism? http://dpldocs.info/experimental-docs/std.parallelism.parallel.2.html

thanks, but I'd rather avoid having to use threads just for this reason.
some other suggestion?

This might be a way to do it under Linux / Posix systems (it reads byte by byte), adapted from my web server which uses it to read the output from php/perl/cgi scripts:

https://github.com/DannyArends/DaNode/blob/master/danode/process.d

It uses fcntl to make sure the pipe is non-blocking
you can read 1 byte from the stdout pipe, then 1 byte from stderr pipe

bool nonblocking(ref File file) {
  version(Posix) {
return(fcntl(fileno(file.getFP()), F_SETFL, O_NONBLOCK) != -1);
  }else{
    return(false);
  }
}

int readpipe(ref Pipe pipe, int verbose = NORMAL){
  File fp = pipe.readEnd;
  try{
    if(fp.isOpen()){
if(!nonblocking(fp) && verbose >= DEBUG) writeln("[WARN] unable to create nonblocking pipe for command");
      return(fgetc(fp.getFP()));
    }
  }catch(Exception e){
writefln("[WARN] Exception during readpipe command: %s", e.msg);
    fp.close();
  }
  return(EOF);
}


pStdIn = File(inputfile, "r");
pStdOut = pipe();
pStdErr = pipe();
auto cpid = spawnShell(command, pStdIn, pStdOut.writeEnd, pStdErr.writeEnd, null);
while(true){
  ch = readpipe(pStdOut);
  outbuffer.put(cast(char)ch);
  ch = readpipe(pStdErr);
  errbuffer.put(cast(char)ch);
}

Hope this works for your usecase

Reply via email to