On Wednesday, 25 February 2015 at 19:09:16 UTC, Ali Çehreli wrote:
On 02/25/2015 05:56 AM, wobbles wrote:

> Hi,
> Any reason why the following wont work?
>
> void main(string[] args)
> {
>      auto pidIn = File.tmpfile();
>      auto pidOut = File.tmpfile();
>      auto pid = spawnProcess(["ls", "./"], pidIn, pidOut,
> std.stdio.stdout, null, Config.newEnv);
>
>      if(wait(pid) == 0)
>          writefln("%s", pidOut.readln());
> }
>
> The pidOut.readln() throws this exception:
> object.Exception@/usr/include/dmd/phobos/std/stdio.d(1377):
Attempt to
> read from an unopened file.
>
> I figured tmpfile() would be open for read/write by default?
> Also, theres no way to pass in args to File.tmpfile() to make
them
> read/write.
>
> Any ideas?

It looks like the file is closed when spawnProcess is finished. I don't know whether it is done by spawnProcess explicitly or whether it is a behavior for temporary files.

How about using a pipe? The following works:

import std.stdio;
import std.process;

void main(string[] args)
{
    auto pidIn = File.tmpfile();
    auto pidOut = pipe();
    auto pid = spawnProcess(["ls", "./" ],
                            pidIn, pidOut.writeEnd,
std.stdio.stdout, null, Config.newEnv);

    if(wait(pid) == 0)
        writeln(pidOut.readEnd.byLine);
}

Ali

This works, Thanks folks!

Reply via email to