Reading input from piped stdin.
nazriel
spam at dzfl.pl
Fri Feb 14 11:11:48 PST 2014
On Friday, 14 February 2014 at 19:09:06 UTC, nazriel wrote:
> On Friday, 14 February 2014 at 19:05:02 UTC, Thomas wrote:
>> I'm new to D, and I find it quite enjoyable so far.
>> I have however stumbled upon a problem which I can't seem to
>> figure out.
>>
>> I am trying to make a program that creates a child process,
>> writes something to the child process stdin and reading from
>> its
>> stdout. I am going to use it later for testing out process pair
>> redundancy.
>>
>> Appearently the child blocks at "s = stdin.readln()". If I
>> remove
>> all writing to the child, and instead just read its output,
>> everything works fine. My code is attached below:
>>
>> import std.process,std.stdio,std.getopt,core.thread;
>>
>> void main(string[] args){
>> bool backup = false;
>> getopt(args, "backup", &backup);
>> writeln("Something worked!");
>> string s = "test";
>> if (backup){
>> writeln("Backup up & running");
>> while(true){
>> s = stdin.readln();
>> writeln(s);
>> }
>> }
>> auto pipes = pipeProcess(["./pipetest", "--backup"],
>> Redirect.all);
>> for(int j = 0; j<5; j++){
>> writeln(j);
>> pipes.stdin.writeln(j);
>> writeln(pipes.stdout.readln());
>> Thread.sleep(500.msecs);
>> }
>> while(true){}
>>
>> }
>>
>>
>>
>> If anyone could spot what rudimentary mistake I have done, I
>> would greatly appreciate it. Alternatively, suggesting another
>> way to implement inter-process communication would also be
>> appreciated :D
>
> Maybe try closing stdin pipe after you are done writing to
> child.
>
> pipes.stdin.close();
>
Ok, nvm.
You are reading from child after each write.
So naa, closing pipe won't do it.
So we are back to flushing :)
> Or try flushing after writing to childs stdin, IIRC:
>
> pipes.stdin.flush();
More information about the Digitalmars-d-learn
mailing list