D-ers,
I am attempting to use pipeProcess for interacting with an external process.
My simplified routine can work somewhat. But, trying to print any messages
that process writes to stderr yields the message:
(master) gnuplot > gnuplot_example
core.exception.InvalidMemoryOperationError@src/core/exception.d(647): Invalid memory operation
Simplified code:
import std.stdio;
import std.process;
class Gnuplot {
ProcessPipes pipe;
void cmd(string txt){
pipe.stdin.writeln(txt);
pipe.stdin.flush();
}
this(){
this.pipe = pipeProcess("/usr/local/bin/gnuplot", Redirect.stdin |
Redirect.stdout | Redirect.stderr);
}
~this(){
pipe.stdin.close();
pipe.stdout.flush();
pipe.stderr.flush();
foreach( line ; pipe.stdout.byLine ) writeln("stdout: ", line);
foreach( line ; pipe.stderr.byLine ) writeln("stderr: ", line);
}
}
void main(){
auto gp = new Gnuplot();
gp.cmd("plot sin(x)");
gp.cmd("pause 2");
gp.cmd("plot line contains error ... should create output to stderr");
gp.cmd("quit");
}
Also, I have found a few examples on similar programs (for example in Adam Ruppe's
D-Cookbook - page 107), which provide some very good information and examples.
But, I do not understand what I am seeing in my program example.
Any pointers are gratefully received. ... especially tutorials or example code
Best Regards,
James
PS You may note that I do not have the line "scope (exit) wait pipe.pid".
Two reasons for this are: I do not understand what this is supposed to do,
and attempts to add this froze my program.
PPS I have seen some of Steven Schveighoffers helpful descriptions about
piped processes and child process hanging with excessive outputs ... this
should not be the case here ... only a handful of bytes might possibly be written.