interacting with a process with redirected stdin/stdout/stderr

Anthony Goins neontotem at gmail.com
Tue Jul 16 10:01:33 PDT 2013


On Monday, 15 July 2013 at 06:46:52 UTC, timotheecour wrote:
> On Monday, 15 July 2013 at 03:49:10 UTC, Timothee Cour wrote:
>> I'm trying to interact with a process using std.process and
>> redirected stdin/stdout/stderr.
>> What would be the recommended way?
>>
>> For example:
>> ----
>> auto pipes=pipeShell("myprocess",Redirect.all);
>> while(true){
>>  pipes.stdin.rawWrite(some_command);
>>  foreach (line; pipes.stdout.byLine) {
>>    //do something with line
>>  }
>> }
>> ----
>>
>> This doesn't work because it might block inside 
>> pipes.stdout.byLine, as the
>> process is requesting more inputs to be written to its stdin 
>> before
>> outputting more bytes to its stdout.
>>
>> What's the right approach?
>> * fcntl(fd, F_SETFL, O_NONBLOCK); didn't seem to work
>> * reading pipes.stdout inside a separate thread?
>> In that second case, how to cleanly dispose of a blocked 
>> thread when we no
>> longer need it?
>>
>> Any detailed example would help.
>> Thanks!
>
>
>
> I tried using a separate thread for reading the process' 
> stdout. It works, except that sometimes the output is shuffled 
> out of order.
>
> Is there anything buggy in this:
>
> ----
> __gshared string output;
>
> void readBlocking(){
> while ((c = fgetc(filepointer)) >= 0)
>       output~=cast(char) c;
> //NOTE: i can use something more efficient here but that's 
> beside the question
> }
>
> thread = new Thread(& readBlocking);
> output=null;
> while(true){
>         Thread.sleep(...);
>         if(condition) break;
> }
> //now output is shuffled out of order sometimes
> ----
>
> Furthermore, is there a standard way to tell when a process is 
> waiting for stdin input ? (cf condition above). Currently I'm 
> checking whether 'output' was modified within a timeout period 
> T, but that's fragile and incurs of penalty of T at least.

Are you looking for select() or poll()
Poll I believe is posix only but I think select is more widely 
available.
Not much of an answer but I hope it helps



More information about the Digitalmars-d-learn mailing list